在数据透视表中抑制具有空值的列

时间:2014-04-21 20:44:04

标签: sql sql-server null pivot-table

嘿伙计们,以下查询基本上将数据透视表中的3个表组合在一起,以显示StaffReference代码,StaffCode作为标题,WipAmount介于其间。这段代码基本上正确运行,但我想要禁止所有字段为NULL的列。这样可以更轻松地阅读报告

当前输出的示例

--------ejh -----aea-----fum       
ejh----null----10.00----6.00
fum---null-----5.00-----null
aea---null-----null-----7.00

我需要的例子:

-------aea-----fum       
ejh--10.00----6.00
fum---5.00----null
aea---null-----7.00

基本上,如果列中充满了NULL值,请忽略该列,我的查询如下。此查询可以工作并显示所有正确的数据

DECLARE @sql varchar(MAX)
DECLARE @columns TABLE (COL varchar(50))
declare @columnscsv varchar(MAX)

insert into @columns
select distinct StaffCode from tblStaff

select @columnscsv = COALESCE(@columnscsv + '],[','') + COL from @columns
set @columnscsv = '[' + @columnscsv + ']'

SET @sql = 'Select StaffReference ' + @columnscsv + ' 
FROM(SELECT ocr.staffcode, em.StaffReference, WipAmount FROM tblTranWip w
Join tblengagement e on e.contindex = w.contindex
Join tblstaff ocr on ocr.staffindex = e.clientpartner
Join tblstaff em on em.staffindex = e.clientmanager
WHERE (w.WIPDate>={ts ''2013-04-01 00:00:00''} 
AND w.WIPDate<{ts ''2014-03-31 00:00:01''}) 
AND w.TransTypeIndex=1 AND w.ContIndex<900000
) as a 
PIVOT (SUM(WipAmount) for StaffCode in (' + @columnscsv + ')) AS PVT 
Order by StaffReference'

EXEC (@sql)

1 个答案:

答案 0 :(得分:1)

您可以使用isnull去除空值,只需指定您想要的任何内容。下面我只使用一个空格,但你可以为任何数值返回0。

SELECT ISNULL(ocr.staffcode, ''), isnull(em.StaffReference, ''), isnull(WipAmount, '') FROM tblTranWip 

已根据要求澄清已编辑 - 请参阅以下评论

因此ISNULL将允许您删除空值,但它会替换这些值。

我将解释您正在使用的代码正在做什么。首先,您使用的是动态SQL,虽然这很有用但可能会产生一些安全隐患。这个链接] 1是我对动态SQL的诅咒和祝福最喜欢的解释之一。如果您以前没有使用它,那么它绝对适合阅读。

此代码将获取您在表中标识的列,并将其填充到逗号分隔的字符串中,稍后将在您的select语句中使用该字符串。

DECLARE @sql varchar(MAX)
DECLARE @columns TABLE (COL varchar(50))
declare @columnscsv varchar(MAX)

insert into @columns
select distinct StaffCode from tblStaff

select @columnscsv = COALESCE(@columnscsv + '],[','') + COL from @columns
set @columnscsv = '[' + @columnscsv + ']'

这一行就是设置列的内容。使用Pivot函数时,必须指定要转动的列,并在此处使用动态SQL,允许它们变量:

SET @sql = 'Select StaffReference ' + @columnscsv + ' 

然而,我注意到的是因为您在运行我在此处列出的内部查询之前已经静态设置了这些值,这限制了您使用所有这些列名称,无论它们是否相同return null:

SELECT ocr.staffcode, em.StaffReference, WipAmount FROM tblTranWip w
Join tblengagement e on e.contindex = w.contindex
Join tblstaff ocr on ocr.staffindex = e.clientpartner
Join tblstaff em on em.staffindex = e.clientmanager
WHERE (w.WIPDate>={ts ''2013-04-01 00:00:00''} 
AND w.WIPDate<{ts ''2014-03-31 00:00:01''}) 
AND w.TransTypeIndex=1 AND w.ContIndex<900000

因此,如果你真的想要排除空列,那么你希望能够动态地填充@columns表,只包含保存值的列,你应该能够识别它们使用我在上面粘贴的初始内部查询。如果您没有从该内部声明中获取列值,那么我们需要更多信息以了解它们的来源。