行から列へのピボット
CoddyのSQLジャーニー「応用」セクションの一部 — レッスン 14/27。
条件付き集計を GROUP BY と組み合わせて、行を列に変換します。これは、スプレッドシートのピボット機能のSQL版です。
sales に (month, product, units) のような行があるとします。月ごとに1行、製品ごとに1列を表示するには、次のようにします:
SELECT
month,
SUM(CASE WHEN product = 'A' THEN units ELSE 0 END) AS product_a,
SUM(CASE WHEN product = 'B' THEN units ELSE 0 END) AS product_b
FROM sales
GROUP BY month各 SUM(CASE …) が参照する GROUP BY バケットは1ヶ月分の行です。CASE は1つの製品のスライスを選択します。
チャレンジ
簡単利用可能なテーブルとカラム:
<strong>sales</strong>:<strong>month</strong>,<strong>product</strong>,<strong>units</strong>
各行が1つの month になるようにデータをピボットし、以下のカラムを含めてください:
monthapples: その月の製品'apples'のunits合計bananas:'bananas'も同様cherries:'cherries'も同様total: その月の全製品のunits合計
total が少なくとも 20 である月のみを返してください。month で並べ替えてください。
チートシート
GROUP BY と 条件付き集計 を使用して、行を列にピボットします:
SELECT
month,
SUM(CASE WHEN product = 'A' THEN units ELSE 0 END) AS product_a,
SUM(CASE WHEN product = 'B' THEN units ELSE 0 END) AS product_b,
SUM(units) AS total
FROM sales
GROUP BY month
HAVING SUM(units) >= threshold
ORDER BY month各 SUM(CASE …) は、各 GROUP BY バケット内でその製品に一致する行のみを集計します。
自分で試してみよう
SELECT month,
-- 製品ごとに1つの SUM(CASE ...)、および合計
FROM sales
GROUP BY month
-- 合計が >= 20 の月に絞り込む
ORDER BY month
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。