裏MySQL クエリー入門(4) 応用編1 クロス集計
基礎編が終わりましていよいよここから、応用編に入っていきます。
MySQLでクロス集計を行うには、一般的に裏MySQL クエリー入門(1)で紹介しましたfieldを使います。
これは、MySQLでクロス集計する場合にわりと知られた方法です。field関数を使用する際に、引数を2つまでと見た場合、条件が満たされた場合は1そうでなければ0というように利用できます。
SELECT sum(field(carrier,1)) "DoCoMo", sum(field(carrier,2)) "au", sum(field(carrier,3)) "SoftBank" FROM user
が、裏MySQL クエリー入門(2)の通り、MySQLは条件式がそのまま真偽値を返しますので、実はfield関数を使うことなく以下のようにシンプルに書けます。条件式そのままなので、応用もこっちの方が効きます。
SELECT sum(carrier=1) "DoCoMo", sum(carrier=2) "au", sum(carrier=3) "SoftBank" FROM user
SQL標準のCASE WHENを使っても同様にクロス集計はできます。こちらはPostgres,Oracle,MySQL共通ですが、ちょっと記述方法が冗長です。
SELECT sum(case when carrier=1 then 1 else 0 end) "DoCoMo", sum(case when carrier=2 then 1 else 0 end) "au", sum(case when carrier=3 then 1 else 0 end) "SoftBank" FROM user
もちろん、Oracleでは『Decode』関数を使って同様にクロス集計ができます。
SELECT sum(decode(carrier,1,1,0,0) "DoCoMo", sum(decode(carrier,2,1,0,0) "au", sum(decode(carrier,3,1,0,0) "SoftBank" FROM user