条件分岐で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に置き換わって表示させることができました