全体表示

[ リスト ]

■なれそめ
お客さんから次のような依頼があった。
「値が0の場合、平均値が下がってしまうので0を除いて平均値をだしてほしい」
普通に考えればとても簡単なことだ。
WHERE句に0以外のレコードを抽出、とすれば済む。
だがひとつ問題があった。それをするのは特定の列だけ。
他の列はそんな計算はしないのだ。困った。。。
ということで「0を除く平均を算出するSQL」を考えることにした。

■考え方
思いついたのはExcelでいうCOUNTIF。AVGで平均を出すのはあきらめて
「合計 ÷ 0以外の個数」とすれば良いのでは?と画策。
COUNTIFをどう実現すればいいかを考えた。
「COUNTIF」の「IF」の部分をSQLにしようとするとCASE文しか思いつかない。

■本日のレシピ
ということで次のようなSQLを書いてみる。

SELECT COL_A, COL_B, COL_C, SUM(COL_D),
CASE WHEN SUM(CASE COL_E WHEN 0 THEN 0 ELSE 1 END) = 0 THEN 0
ELSE SUM(COL_E) / SUM(CASE COL_E WHEN 0 THEN 0 ELSE 1 END) END
FROM TABLE_1
GROUP BY COL_A, COL_B, COL_C

「SUM(CASE COL_E WHEN 0 THEN 0 ELSE 1 END)」の部分がCOUNTIFにあたる。
0なら0、0以外なら1として集計すれば0以外の個数がわかることになる。はず。きっと。
さらに、割り算なので0除算チェック用にさらにCASE文を使用。

この記事に

閉じる コメント(0)

コメント投稿

顔アイコン

顔アイコン・表示画像の選択

名前パスワードブログ
絵文字
×
  • オリジナル
  • SoftBank1
  • SoftBank2
  • SoftBank3
  • SoftBank4
  • docomo1
  • docomo2
  • au1
  • au2
  • au3
  • au4
投稿

.


みんなの更新記事