条件分岐でNullを0に置き換える方法~case left join~

MySQL

条件分岐でNullのデータを0に置き換える方法について紹介していきます

Nullを0に置き換える書き方

外部結合(left outer join)などを利用してすべての商品の売上個数などを調べたいときなど、カラムにNullとは言っているのはあまりよくありません

そんな時には条件分岐を利用することでNullを0に置き換えることができます。

前提条件

使用するテーブル:productsテーブル、orders_detailsテーブル

productsテーブル ・・・商品一覧を管理する

+----+-----------------+-------+
| id | name            | price |
+----+-----------------+-------+
|  1 | ドックフード001 |  1000 |
|  2 | ドックフード002 |  2000 |
|  3 | ドックフード003 |  1500 |
|  4 | ドックフード004 |  1800 |
|  5 | ドックフード005 |  2500 |
|  6 | ドックフード006 |  1500 |
+----+-----------------+-------+
6 rows in set (0.001 sec)

orders_detailsテーブル・・・注文内容の詳細な内訳を管理

+------+----------+-------------+----------+
| id   | quantity | order_price |product_id|
+------+----------+-------------+----------+
|    1 |        3 |        6000 |        2 |
|    2 |        2 |        2000 |        1 |
|    3 |        2 |        3000 |        3 |
|    4 |        1 |        2500 |        5 |
|    5 |        4 |        6000 |        6 |
|    6 |        3 |        6000 |        2 |
+------+----------+-------------+----------+

条件

  • productsテーブルからid,nameを取得
  • order_detailsテーブルのquantiy(販売数)を商品別にカウントする
  • productsテーブルのidとproduct_idでテーブルを紐づける
条件分岐を使用しないで出力(Nullを0に置き換えない)

普通に各テーブルを外部結合 (left outer join)した場合の出力結果を確認します。

外部結合が意味不明な人は下記を参照

使用するSQL

select p.id,p.name,quantity  
from products p 
   left outer join 
     order_details od 
   on 
     p.id = od.order_id 
   group by p.id;

何の変哲もないどこにでもある外部結合のSQL文です

出力結果

+----+-----------------+----------+
| id | name            | quantity |
+----+-----------------+----------+
|  1 | ドックフード001 |        2 |
|  2 | ドックフード002 |        3 |
|  3 | ドックフード003 |        2 |
|  4 | ドックフード004 |     NULL |
|  5 | ドックフード005 |        1 |
|  6 | ドックフード006 |        4 |
+----+-----------------+----------+
6 rows in set (0.002 sec)

id4の商品(ドックフード04)に販売履歴がなく個数が入力されていないため値がNullとなっていることがわかります。

これを0に置き換えていきます。

Nullを0に置き換えて出力する

条件分岐を追加してNullを0に置き換えます

条件分岐の詳細な解説は以下を参照

使用するSQL

select p.id,p.name,case 
   when 
     sum(od.quantity) is null then 0 
   else 
     sum(od.quantity) 
   end as quantity  
from products p 
   left outer join 
     order_details od 
   on 
     p.id = od.order_id 
   group by p.id;

主に追加された行について解説

赤字が追加された行となります。

sum(od.quantity) is null then 0
販売数がNullとなっているものを0に置き換える記述です

sum(od.quantity)
Sum集約関数を利用して販売数がNullではないものは何もせずに普通に合計数を数えます。

group by p.id
商品Idごとに販売数を合計するようにグループ化をします

出力結果

+----+-----------------+----------+
| id | name            | quantity |
+----+-----------------+----------+
|  1 | ドックフード001 |        2 |
|  2 | ドックフード002 |        6 |
|  3 | ドックフード003 |        2 |
|  4 | ドックフード004 |        0 |
|  5 | ドックフード005 |        1 |
|  6 | ドックフード006 |        4 |
+----+-----------------+----------+
6 rows in set (0.001 sec)

id4の商品(ドックフード004)がNullから0に置き換わって表示させることができました

タイトルとURLをコピーしました