MySQLでの条件付きSUM,COUNT

公開日: : MySQL, 備忘録

以前つっかかったMySQLでの条件付きSUM,条件付きCOUNTについて備忘録。。。

通常、条件文はwhere文で記述することが多いけど、それだと1つのSQL文で柔軟に条件分岐が書けない場合がある。
それをselect文での条件分岐で解決しよう、というお話。

 

例として、以下の様なテーブル(sushi_map)について考える。

+--------+-------+-------+------+
| name   | price | extra | num  |
+--------+-------+-------+------+
| ebi    |   100 |     0 |   20 |
| ikura  |   120 |     0 |   12 |
| maguro |   140 |     0 |   30 |
| maguro |   170 |     1 |   40 |
| ikura  |   130 |     1 |   27 |
| ebi    |   180 |     1 |   33 |
+--------+-------+-------+------+

この時、例えば「extra=1のmaguroの合計金額(A)」、「extra=1のnameの数(B)」、「price > 150の合計金額(C)」をいっぺんに出したいとする。

それを実現するSQL文は以下で実現できる。

mysql> select
    -> sum(case when extra='1' and name='maguro' then price*num else 0 end)
    -> as A,
    -> sum(case when extra='1' then 1 else 0 end)
    -> as B,
    -> sum(case when price > 150 then price*num else 0 end)
    -> as C
    -> from sushi_map;

出力は、以下のようになる。

+------+------+-------+
| A    | B    | C     |
+------+------+-------+
| 6800 |    3 | 12740 |
+------+------+-------+

うん、あってますね、たぶん。

まあ味噌はSQL文での2,4,6行目。

sum(case when (条件文) then (設定したい値) else 0 end)

whereで条件を絞るとselectの全項目がそれの影響を受けちゃうんで都合がわるいこともあるのです。
SQL文複数書いてwhereで順々にやっていっても出せるわけだけれども、PHPのforeachなどで順々に値を取り出したいときなんかは一度にselectできる方が嬉しい事もよくあるわけです。

まだもっとイイやり方とかあるのかもしれませんが、取り敢えずはこれで欲しいものは取れるのでよしっと。

GoogleAdsense

関連記事

Win7, 64bit環境でのcocos2d-x環境構築まとめ

さて、いままでJavaオンリーでゴリゴリとアプリリリースしてきたわけですが、ゲームを作るとなると、ど

記事を読む

PHPのextensionが読み込まれない問題…

大したあれではないが、ちょっと詰まったのでメモ。。。 事のぼったんは久々にWordPressを

記事を読む

node_cookie

【Node.js】 Cookieの取り扱いまとめ

最近流行りのNode.jsですが、Cookieに関して、いくつかお決まりの取り扱い方があり、

記事を読む

john the ripper

パスワードクラックツール JOHN THE RIPPER 使い方まとめ

パスワードクラッキングツールである「JOHN THE RIPPER」の使い方を備忘録としてまとめてお

記事を読む

dordoidくん

【Android】難読化ツールProguard設定まとめ

Android開発環境の1つであるEclipseでは、標準でAndroidプロジェクトの難読化ツール

記事を読む

bash設定ファイルについてまとめてみた

仮想環境を組んだ時に、環境変数が所どころ未設定なことがあった。 環境変数の設定にはbashの設定フ

記事を読む

openssh

SSH CA認証まとめ

SSHでの接続を、CA認証でやってみる。 備忘録として残しておくの。。。 概要 Ope

記事を読む

nerdtree

Vimプラグイン「NERDTree」設定・コマンド備忘録

Vimのプラグインである「NERDTree」について、設定・コマンドを備忘録としてまとめておきます。

記事を読む

android_kitkat

Android4.4(API19)KitKatでのGraphicalLayout,AdMob問題

Androidの新バージョンKitKatがリリースされてもう結構経つが、いまさら我が開発環境でも導入

記事を読む

【Androidエラー】Conversion to Dalvik format failed with error 1

Androidにおいて、アプリケーションを作成し終え、いざパッケージをエクスポートっ!!というところ

記事を読む

GoogleAdsense

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

GoogleAdsense

PAGE TOP ↑