好的,所以我自己需要一个动态数据透视表,这很好。
我需要创建一个动态大小的临时表来保存这些值,最终我将其作为一个。称之为#table
插入后我可以摆脱空值而不动态吗?我真的不想要更可怕的红色东西。
#table
Year CashflowID1 CashflowID2 CashflowID3........CashflowIDn
1 NULL -4 1.23............... etc
2 43 78 -34 ............... NULL
每个cashflow id可能包含不同年份的数据,从而产生一堆空值。
像
这样的简单SELECT ISNULL(*,0)
FROM #table
但是,你知道,这很聪明,实际上有效。顺便说一下,我尝试使用默认值和不可为空的列设置#table,但这只是打破了插入。
如果我错过任何明显的或未能提供必要的信息,请大声喊叫。
干杯。
答案 0 :(得分: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)
答案 1 :(得分:0)
我建议再使用默认值进行一次尝试,此功能应该适用于您的情况。它是更复杂的解决方案,因为您不会依赖查询中的逻辑,也不会使用NULL复制替换。