裏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