动态数据透视表,如何在不知道列名的情况下删除NULL值?

时间:2012-05-04 09:13:39

标签: sql sql-server-2008 tsql

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

我需要创建一个动态大小的临时表来保存这些值,最终我将其作为一个。称之为#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,但这只是打破了插入。

如果我错过任何明显的或未能提供必要的信息,请大声喊叫。

干杯。

2 个答案:

答案 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复制替换。