SQL で、売上のない店舗が一覧から消える(JOIN と LEFT JOIN の違い)
濵口 翔長崎で、Power BI のつまずきを記録しています目次
確認日2026年10月21日。
PostgreSQL 16.13(Docker の コンテナ)で、 疑似データを 使って、 実際に 動かして 確かめました。疑似データです。 実在の 確認できていない店舗や 売上ではありません。 ことは、 末尾に まとめました。
店舗ごとの
結論
(30秒版)
- 店舗の
表と 売上の 表を JOIN(内部結合)すると、 売上が 1件も ない 店舗は、 結果に 出ませんでした。 LEFT JOINにすると、 その 店舗の 行が 出て、 売上は NULL(空白)でした。 COALESCE(SUM(売上), 0)で、NULLを0 に できました。 - Power BI で、
データの ない 店舗が 表に 出る ・出ないのと、 同じ 種類の 話です。
使ったデータ
店舗が
CREATE TABLE stores(store_id int PRIMARY KEY, store_name text, area text);
CREATE TABLE sales(sale_id serial PRIMARY KEY, sale_date date,
store_id int REFERENCES stores, amount int);
INSERT INTO stores VALUES
(1,'渋谷','東京'), (2,'新宿','東京'), (3,'梅田','大阪'), (4,'品川','東京');
売上のgenerate_series で、
JOIN だと、品川が消える
SELECT st.store_name, SUM(s.amount) AS total
FROM stores st
JOIN sales s USING(store_id)
GROUP BY st.store_name
ORDER BY total DESC;
結果は、
| store_name | total |
|---|---|
| 梅田 | 1131816 |
| 新宿 | 1131744 |
| 渋谷 | 1129872 |
品川は、JOIN(内部結合)は、sales に
LEFT JOIN にすると、行が戻る
SELECT st.store_name, SUM(s.amount) AS total
FROM stores st
LEFT JOIN sales s USING(store_id)
GROUP BY st.store_name
ORDER BY total DESC NULLS LAST;
結果は、
| store_name | total |
|---|---|
| 梅田 | 1131816 |
| 新宿 | 1131744 |
| 渋谷 | 1129872 |
| 品川 | (NULL) |
stores をsales にtotal は、NULL(空
ORDER BY total DESC だけだと、NULL がNULLS LAST を
NULL を 0 にする
SELECT st.store_name, COALESCE(SUM(s.amount), 0) AS total
FROM stores st
LEFT JOIN sales s USING(store_id)
GROUP BY st.store_name
ORDER BY total DESC;
品川のtotal が、0 にCOALESCE は、NULL でない
左右を間違えやすい点
LEFT JOIN は、左側のFROM のFROM sales s LEFT JOIN stores st とFROM の
関連: ウィンドウ関数でも確かめた
同じ
- 月別の
累計: SUM(amt) OVER (ORDER BY month)。2024年は、 1月 132,912、 2月までで 258,660、 3月までで 392,292 でした。 - 前年同月比:
LAG(amt, 12) OVER (ORDER BY month)。2025年1月は、 前年の 132,912 に 対して 151,512(114.0%)でした。 - 構成比:
SUM(SUM(s.amount)) OVER ()で割る。 3店舗とも、 約 33% でした。 - エリア内の
順位: RANK() OVER (PARTITION BY area ORDER BY total DESC)。
Power BI の
Power BI との関係
Power BI の
この
この記事で確認できたこと・できていないこと
確認日: 2026年10月21日。
確認できた
JOINで、売上の ない 店舗が 結果から 消える こと LEFT JOINで、その 店舗の 行が NULLの売上で 出る こと COALESCE(SUM(...), 0)で、0になる こと ORDER BY ... DESCでNULLが先頭に 来る こと、 NULLS LASTで末尾に できる こと - 累計・
前年同月比・構成比・エリア内の 順位の クエリが、 PostgreSQL 16 で 動く こと
確認できていない
- PostgreSQL 以外
(MySQL、 SQL Server、 BigQuery など)での 動き。 NULLS LASTは、PostgreSQL の 書き方です。 ほかの データベースでは、 書き方が 違うことがあります。 - 大きな
データでの 速さ - Power BI が
発行する SQL との 対応 - 公式ドキュメントとの
照合