備忘録 Having句で集計関数を利用する

 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 商品品種名
             
  
  
 

0 件のコメント:

コメントを投稿

PowerShellでEdgeを自動化(インストール不要。参考:郵便追跡サービス自動操作)

1.経緯について  RPAのソフトをインストールできないので、これまでVBSでCreateObjectでブラウザの自動操作をすることがたまにあった。 ※いざというときの手札として持っているだけで安心感が段違い  見た目上IEがインストールされていなくても、CreateObject...