- 締切済み
[SQL SERVER2005]列項目から行への展開
下記のようなテーブルA,Bがあるとします Aは会社/得意先/年度別の売上げ金額を月別のキー数値に集計したもの、 Bは会社/得意先/年度/月別の売上げ金額を月別のキー数値に集計したものです TABLE A キー:COMPANY 、CUSTOMER 、YEAR キー数値:SALES01、、、、SALES12 TABLE B キー:COMPANY 、CUSTOMER 、YEAR、MONTH キー数値:SALES もともとAのテーブルに下記のようにデータが入っています。 COMPANY CUSTOMER YEAR SALES01 SALES02,,,,,SALES12 ------------------------------------------------------ 1000 A0000001 2007 1000 5000 ,,,, 2000 1000 A0000002 2007 2000 0 ,,,, 1000 : これを各月別の金額を行に展開してBに下記のようにセットしたいのです。 COMPANY CUSTOMER YEAR MONTH SALES ----------------------------------------- 1000 A0000001 2007 01 1000 1000 A0000001 2007 02 5000 : 1000 A0000001 2007 12 2000 1000 A0000002 2007 01 2000 1000 A0000002 2007 02 0 1000 A0000002 2007 12 1000 どのようなSQL文を書くのがお勧めでしょうか? 12回SQLを叩いてINSERTすれば出来そうですがもっとうまいやり方があるのではないかと 思って質問させていただきました。 ちなみにTABLE Aは外部システムのテーブルをSSISを利用して 定期的に取り込んでいます、最終的にはBIのSSASでキューブにまとめます。 初歩的かもしれませんがよろしくお願いいたします。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- jamshid6
- ベストアンサー率88% (591/669)
1から12までの数字が入った1フィールドだけのテーブルがあれば、1クエリでできます。 CREATE TABLE MEASURETBL([SEQ][int]) SELECT t.[COMPANY], t.[CUSTOMER], t.[YEAR], m.SEQ, ISNULL(CASE WHEN m.SEQ=1 THEN t.SALES01 WHEN m.SEQ=2 THEN t.SALES02 WHEN m.SEQ=3 THEN t.SALES03 WHEN m.SEQ=4 THEN t.SALES04 WHEN m.SEQ=5 THEN t.SALES05 WHEN m.SEQ=6 THEN t.SALES06 WHEN m.SEQ=7 THEN t.SALES07 WHEN m.SEQ=8 THEN t.SALES08 WHEN m.SEQ=9 THEN t.SALES09 WHEN m.SEQ=10 THEN t.SALES10 WHEN m.SEQ=11 THEN t.SALES11 WHEN m.SEQ=12 THEN t.SALES12 END,0) FROM TABLE_A CROSS JOIN MEASURETBL m もしくは動的クエリでやるとかですかね DECLARE @CTR int DECLARE @SQL varchar(max) SET @CTR=1 WHILE (@CTR<=12) BEGIN SET @SQL = ISNULL(@SQL+' UNION ALL ','') +'SELECT [COMPANY],[CUSTOMER],[YEAR],'+CONVERT(varchar,@CTR)+',' +'SALES'+RIGHT('00'+CONVERT(varchar,@CTR),2)+' ' +'FROM TABLE_A' SET @CTR = @CTR + 1 END EXEC (@SQL) この程度なら12回Insertしても、、とは思いますが
お礼
早速の回答ありがとうございます。 明日出社したら試してみます。