PR

SQLでリストをクロス集計表(星取表)に加工する

コラム
スポンサーリンク

SQLを使ってリスト情報からクロス表を作ってみます。
相撲の星取表のようなイメージです。

SQLのクロス集計で二重管理のリスクを避ける


例えば、製品のオプション適用状況を機種別にカタログに掲載するとします。
基幹システムにあるデータ(下図左)と、カタログ用にはエクセルで下図右のような表を別途作成していないでしょうか。
このような二重管理は、開発過程で設計変更があった時に情報の食い違いのリスクがあります。

SQLでリスト情報をクロス集計表に加工する

リストをSQLでクロス集計表に加工してみます。
例えば下図のように、機種とそれに対応しているオプションの関係を示した一覧表があったとします。

SELECT A.seihin AS '製品',
  CASE WHEN SUM(CASE WHEN [option] = 'オプションA' THEN 1 ELSE NULL END) >= 1
       THEN '○' ELSE '-' END AS 'オプションA',
  CASE WHEN SUM(CASE WHEN [option] = 'オプションB' THEN 1 ELSE NULL END) >= 1
       THEN '○' ELSE '-' END AS 'オプションB',
  CASE WHEN SUM(CASE WHEN [option] = 'オプションC' THEN 1 ELSE NULL END) >= 1
       THEN '○' ELSE '-' END AS 'オプションC',
  CASE WHEN SUM(CASE WHEN [option] = 'オプションD' THEN 1 ELSE NULL END) >= 1
       THEN '○' ELSE '-' END AS 'オプションD',
  CASE WHEN SUM(CASE WHEN [option] = 'オプションE' THEN 1 ELSE NULL END) >= 1
       THEN '○' ELSE '-' END AS 'オプションE'
  FROM [dbo].[Sheet1] A
 GROUP BY seihin;

これをエクセルに返してあげたり、この結果をエクセルにインポートすれば出来上がりです。
※画面はMicrosoft SQL Serverです

縦持ちデータを横持ちデータに変換する

次に、存在したら”○”という形式ではなく、部品表を縦持ちから横持ちに変換してみます。

SELECT A.seihin AS '製品',
       SUM(CASE WHEN A.buhin = '部品1' THEN A.siyou ELSE 0 END) AS '部品1',
       SUM(CASE WHEN A.buhin = '部品2' THEN A.siyou ELSE 0 END) AS '部品2',
       SUM(CASE WHEN A.buhin = '部品3' THEN A.siyou ELSE 0 END) AS '部品3',
       SUM(CASE WHEN A.buhin = '部品4' THEN A.siyou ELSE 0 END) AS '部品4',
       SUM(CASE WHEN A.buhin = '部品5' THEN A.siyou ELSE 0 END) AS '部品5',
       SUM(CASE WHEN A.buhin = '部品6' THEN A.siyou ELSE 0 END) AS '部品6',
       SUM(CASE WHEN A.buhin = '部品7' THEN A.siyou ELSE 0 END) AS '部品7',
       SUM(CASE WHEN A.buhin = '部品8' THEN A.siyou ELSE 0 END) AS '部品8',
       SUM(CASE WHEN A.buhin = '部品9' THEN A.siyou ELSE 0 END) AS '部品9',
       SUM(CASE WHEN A.buhin = '部品10' THEN A.siyou ELSE 0 END) AS '部品10'
  FROM [tst].[dbo].[Sheet2] A
 GROUP BY seihin;

CASEを使用したこのようなトリックは下記の書籍で学ぶことができます。

コメント

タイトルとURLをコピーしました