MW211 EXIT

devlog
MySQL/件数集計の複数条件(2)
2014年06月29日
前回の方法をSUM関数を使って行うこともできる。
┌──────────────────────────────────────┐
│SELECT SUM(TRUE)           AS `全ての件数(NULLを含む)`,                     │
│       SUM(列 IS NOT NULL) AS `全ての件数(NULLを除く)`,                     │
│       SUM(列 > 0)         AS `正数の集計`,                                 │
│       SUM(列 = 0)         AS `ゼロの集計`,                                 │
│       SUM(列 < 0)         AS `負数の集計`                                  │
│    FROM 表;                                                                │
└──────────────────────────────────────┘
これは「TRUE」が「1」、「FALSE」が「0」と換算されることを利用している。
(ちなみに「NULL」は「NULL」のままだが集計から除外されるのでほぼ「0」扱い)
  ・SELECT SUM(TRUE);              → 1
  ・SELECT SUM(FALSE);             → 0
  ・SELECT SUM(NULL);              → NULL
  ・SELECT COALESCE(SUM(NULL), 0); → 0

データが1件もない場合については、
こちらは(上記列全てが)「NULL」となってしまうので
念のため「COALESCE(,0)」で「0」変換の補正を付けてあげた方がより無難かも。
┌──────────────────────────────────────┐
│SELECT COALESCE(SUM(TRUE)          , 0) AS `全ての件数(NULLを含む)`,        │
│       COALESCE(SUM(列 IS NOT NULL), 0) AS `全ての件数(NULLを除く)`,        │
│       COALESCE(SUM(列 > 0)        , 0) AS `正数の集計`,                    │
│       COALESCE(SUM(列 = 0)        , 0) AS `ゼロの集計`,                    │
│       COALESCE(SUM(列 < 0)        , 0) AS `負数の集計`                     │
│    FROM 表;                                                                │
└──────────────────────────────────────┘
但し、データが1件以上あれば、条件に一致しなくても「0」となる。
#正数が1件だけあっても、それで負数の集計ではFALSE(=0)が1件と換算されるので
  負数の集計が(0となり)NULLになることはない。
分類:MySQL