プロが教えるわが家の防犯対策術!

SQLserverでのクロス集計についてご質問ですが、
クロス集計後の結果、列を動的に変更させる必要がある場合、ストアドプロシージャで処理しなければならないかとは思うのですが、
例えば
T_売上
番号,日付,数
1,2004/09/10,10
1,2004/09/14,20
1,2004/09/18,10
2,2004/09/10,20
2,2004/09/14,20
3,2004/09/18,10

番号,2004/09/10,2004/09/14,2004/09/18
1,10,20,10
2,20,20,0
3,0,0,10
という形に出力したいときは、具体的にどういう手順でSSQLを作成していけばよろしいでしょうか。
(日付部分が動的に増えたり減ったりします)

A 回答 (1件)

declare @sql1 varchar(8000)


declare @sql2 varchar(8000)
declare @i int
declare @fld1 varchar(20)
declare @fld2 varchar(20)
declare @fldx varchar(20)
select @sql1='select T売上.番号'
select @sql2=''
select @fld1='日付'
select @fld2='数'
select @i=0

declare fld_lst cursor for
select distinct convert(varchar,日付,111) as 日付 from T売上 order by 日付

open fld_lst

while @i<100
begin
fetch next from fld_lst into @fldx
if @@fetch_status<>0 break

set @sql1=@sql1+',sum(case when '+convert(varchar,@fld1,111)+'='''+@fldx
+''' then '+@fld2+' else 0 end) as ['+@fldx+']'

set @i=@i+1
end

if @@fetch_status=0
while 1=1
begin
fetch next from fld_lst into @fldx
if @@fetch_status<>0 break
set @sql2=@sql2+',sum(case when '+convert(varchar,@fld1,111)+'='''+@fldx
+''' then '+@fld2+' else 0 end) as ['+@fldx+']'
end

close fld_lst
deallocate fld_lst

exec(@sql1+@sql2+' from T売上'
+' group by T売上.番号 order by T売上.番号')
return

以上でできるはずでは。

この回答への補足

再度すみません。
このプロシージャの結果を別のプロシージャで取得したい場合、テンプレートテーブルを使って渡すことになるのでしょうか?
それともそれ以外になにか方法はありますでしょうか。。

補足日時:2004/09/18 08:50
    • good
    • 0
この回答へのお礼

ありがとうございます!
早速入力してみましたが、うまくいきそうです。
すごすぎです!
私の先生になってほしいくらいです。。

お礼日時:2004/09/17 15:51

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す