1

さて、動的ピボットテーブルが必要になったので、それで問題ありませんでした。

これらの値を保持するために動的なサイズの一時テーブルを作成する必要がありましたが、最終的にはそれを実行しました。それを#tableと呼びました

動的に実行せずに、挿入後にnullを取り除くことはできますか?これ以上恐ろしい赤いものは本当に欲しくない。

#table 

Year   CashflowID1   CashflowID2   CashflowID3........CashflowIDn   
 1      NULL          -4            1.23............... etc
 2      43            78            -34 ............... NULL

各キャッシュフローIDには、異なる年のセットのデータが含まれている可能性があり、その結果、多数のnullが発生します。

のような単純なもの

SELECT ISNULL(*,0) 
FROM   #table

しかし、ご存知のとおり、それは賢く、実際に機能します。余談ですが、デフォルト値とnull許容でない列を使用して#tableを設定しようとしましたが、挿入が壊れてしまいました。

明らかなことを見逃したり、必要な情報を提供できなかったりした場合は、叫んでください。

乾杯。

4

2 に答える 2

2

だから、これは少し厄介になりますが、ここにアイデアがあります

このために、私はマスターテーブルからクエリを実行し、受信した変量(日時)をピボットします。

declare @columns varchar(max)
declare @columnsisnull varchar(max)
declare @sql nvarchar(max)

SELECT  @columns = STUFF(( SELECT DISTINCT TOP 100 PERCENT '],[' + CONVERT(VARCHAR(7), m1.received, 120)
          FROM master m1 where m1.received between DATEADD(year, -1, getdate()) and GETDATE()
   ORDER BY  '],[' + CONVERT(VARCHAR(7), m1.received, 120) desc
   FOR XML PATH('')), 1, 2, '') + ']'

    SELECT  @columnsisnull = STUFF(( SELECT DISTINCT TOP 100 PERCENT ', isnull([' + CONVERT(VARCHAR(7), m1.received, 120) + '],0)'

          FROM master m1 where m1.received between DATEADD(year, -1, getdate()) and GETDATE()
   --ORDER BY  ', isnull([' + CONVERT(VARCHAR(7), m1.received, 120) + '],0)'
   FOR XML PATH('')), 1, 2, '')  

これは基本的にcolsを取得するためのコードのように見えますが、@ columnsisnullが異なり、isnull関数を列に追加するだけです。

次に、@sqlの場合

set @sql = N'SELECT name, ' + @columnsisnull + ' from master ) p
pivot(sum(amount) for received in ( '+@columns+')) as pvt'

execute(@sql)
于 2012-05-04T13:06:21.623 に答える
0

デフォルト値でもう一度試すことをお勧めします。この機能はあなたのケースではうまくいくはずです。クエリのロジックに依存せず、NULLでの置換を複製しないため、より洗練されたソリューションです。

于 2012-05-04T09:24:41.543 に答える