1

好的,所以我让自己需要一个动态数据透视表,这很好。

我需要创建一个动态大小的临时表来保存这些值,最终我解决了这个问题。称之为#table

我可以在插入后摆脱空值而不动态执行它吗?我真的不想要更可怕的红色东西。

#table 

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

每个现金流 ID 可能包含不同年份的数据,从而导致一堆空值。

像这样简单的东西

SELECT ISNULL(*,0) 
FROM   #table

但是,你知道,这很聪明,而且确实有效。顺便说一句,我尝试使用默认值和不可为空的列设置#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 回答