HAVING句をうまく利用する
意外と思いつかなかったけど、HAVING句でCASE句を利用することができる
※例は適当です。グループの中で条件を満たしていないものがあるかどうかのチェックができます。
・会社ごとに振込先口座を持っている
・グループ会社の中で異なる振込先があるグループがあるか
(例)
会社CD | 会社名 | グループ会社CD | 請求会社CD | 親会社CD | 銀行CD | 支店CD | 口座番号 | 口座名義人
00001 |テスト1 | 001 | 00001 | 00001 | 0001 | 002 | 1234567 | カ)テスト1
00002 |テスト1-1 | 001 | 00002 | 00001 | 0001 | 002 | 0004567 | カ)テスト2
00003 |テスト1-2 | 001 | 00001 | 00001 | 0001 | 002 | 1234567 | カ)テスト1
10001 |テスト2 | 002 | 10001 | 10001 | 0001 | 002 | 1234567 | カ)テスト2
10002 |テスト2-1 | 002 | 10001 | 10001 | 0001 | 002 | 1234567 | カ)テスト2
-- 「請求先」が「親会社」になっていないデータが混じっているグループ会社を抽出
-- グループCDで集約を行い、グループCDでまとめた件数=レコードの中で「請求会社CD」
SELECT グループ会社CD
FROM 契約会社テーブル
GROUP BY グループ会社CD
HAVING COUNT(*) <> SUM(CASE
WHEN 請求会社CD = 親会社CD THEN 1
ELSE 0
END) AS 抽出対象
上記のデータ例で行くと「グループ会社CD:001」が抽出される
集計関数の中にもCASE式が書けるって初めて知ったときに結構衝撃だったけど、月ごとの集計結果を列で持ちたいときとかにも使えるので素晴らしい。
SELECT
商品品種名
,SUM(CASE WHEN SUBSTR(売上日,5,2) = '01' THEN 売上金額 ELSE 0 END) AS 1月売上
,SUM(CASE WHEN SUBSTR(売上日,5,2) = '02' THEN 売上金額 ELSE 0 END) AS 2月売上
,SUM(CASE WHEN SUBSTR(売上日,5,2) = '03' THEN 売上金額 ELSE 0 END) AS 3月売上
,SUM(CASE WHEN SUBSTR(売上日,5,2) = '04' THEN 売上金額 ELSE 0 END) AS 4月売上
・
・
・
FROM 売上テーブル
WHERE 売上日 BETWEEN '20210101' AND '20211231'
GROUP BY 商品品種名
意外と思いつかなかったけど、HAVING句でCASE句を利用することができる
※例は適当です。グループの中で条件を満たしていないものがあるかどうかのチェックができます。
・会社ごとに振込先口座を持っている
・グループ会社の中で異なる振込先があるグループがあるか
(例)
会社CD | 会社名 | グループ会社CD | 請求会社CD | 親会社CD | 銀行CD | 支店CD | 口座番号 | 口座名義人
00001 |テスト1 | 001 | 00001 | 00001 | 0001 | 002 | 1234567 | カ)テスト1
00002 |テスト1-1 | 001 | 00002 | 00001 | 0001 | 002 | 0004567 | カ)テスト2
00003 |テスト1-2 | 001 | 00001 | 00001 | 0001 | 002 | 1234567 | カ)テスト1
10001 |テスト2 | 002 | 10001 | 10001 | 0001 | 002 | 1234567 | カ)テスト2
10002 |テスト2-1 | 002 | 10001 | 10001 | 0001 | 002 | 1234567 | カ)テスト2
-- 「請求先」が「親会社」になっていないデータが混じっているグループ会社を抽出
-- グループCDで集約を行い、グループCDでまとめた件数=レコードの中で「請求会社CD」
SELECT グループ会社CD
FROM 契約会社テーブル
GROUP BY グループ会社CD
HAVING COUNT(*) <> SUM(CASE
WHEN 請求会社CD = 親会社CD THEN 1
ELSE 0
END) AS 抽出対象
上記のデータ例で行くと「グループ会社CD:001」が抽出される
集計関数の中にもCASE式が書けるって初めて知ったときに結構衝撃だったけど、月ごとの集計結果を列で持ちたいときとかにも使えるので素晴らしい。
SELECT
商品品種名
,SUM(CASE WHEN SUBSTR(売上日,5,2) = '01' THEN 売上金額 ELSE 0 END) AS 1月売上
,SUM(CASE WHEN SUBSTR(売上日,5,2) = '02' THEN 売上金額 ELSE 0 END) AS 2月売上
,SUM(CASE WHEN SUBSTR(売上日,5,2) = '03' THEN 売上金額 ELSE 0 END) AS 3月売上
,SUM(CASE WHEN SUBSTR(売上日,5,2) = '04' THEN 売上金額 ELSE 0 END) AS 4月売上
・
・
・
FROM 売上テーブル
WHERE 売上日 BETWEEN '20210101' AND '20211231'
GROUP BY 商品品種名
0 件のコメント:
コメントを投稿