我无法从动态查询结果中删除空值。
以下是#t3表中的内容示例:
BornDate | ClickDate | Clicks
10/23/2014 | 11/19/2014 | 25
10/23/2014 | 11/18/2014 | 6
10/23/2014 | 11/20/2014 | 5
10/23/2014 | 11/22/2014 | 17
10/23/2014 | 11/23/2014 | 11
10/24/2014 | 11/19/2014 | 1
10/24/2014 | 11/18/2014 | 6
10/24/2014 | 11/20/2014 | 3
10/24/2014 | 11/21/2014 | 3
10/24/2014 | 11/23/2014 | 2
所以,我的问题是,当我运行以下查询时,如何删除NULL
值?
这是我的查询
DECLARE @DynamicPivotQuery AS NVARCHAR(MAX)
DECLARE @ColumnName AS NVARCHAR(MAX)
--Get distinct values of the PIVOT Column
SELECT @ColumnName= ISNULL(@ColumnName + ',','')
+ QUOTENAME(ClickDate)
FROM (SELECT DISTINCT ClickDate FROM #t3 ) AS ClickDate order by ClickDate
--Prepare the PIVOT query using the dynamic
SET @DynamicPivotQuery =
'SELECT BornDate, ' + @ColumnName + '
FROM #t3
PIVOT (SUM(Clicks)
FOR ClickDate IN (' + @ColumnName + ')) AS PVTTable order by 1, 2'
--Execute the Dynamic Pivot Query
EXEC sp_executesql @DynamicPivotQuery
查询结果为:
| BORNDATE | 2014-11-18 | 2014-11-19 | 2014-11-20 | 2014-11-21 | 2014-11-22 | 2014-11-23|
|------------|------------|------------|------------|------------|------------|-----------|
| 2014-10-23 | 6 | 25 | 5 | (null) | 17 | 11 |
| 2014-10-24 | 6 | 1 | 3 | 3 | (null) | 2 |
您可以在2014年11月21日的专栏中看到NULLS,以及2014年11月22日专栏中的10/24/2014行。我想替换这些空值。
答案 0 :(得分:4)
不是使用@ColumnName
将值列表变为新列和最终选择列表,而是需要创建一个单独的列名列表,将null
替换为零 - 类似于isnull(yourcol, 0) as yourcol
。
我通常使用FOR XML
和STUFF
来连接我的列名,因此您可以使用:
--Get null replacements of the PIVOT Column
select @NullName = STUFF((SELECT ', IsNull(' + QUOTENAME(ClickDate)+', 0) as '+QUOTENAME(ClickDate)
from #t3
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
这将创建将用于最终选择列表的第二列列名。然后你的PIVOT代码将是:
DECLARE @DynamicPivotQuery AS NVARCHAR(MAX)
DECLARE @ColumnName AS NVARCHAR(MAX)
DECLARE @NullName AS NVARCHAR(MAX)
--Get distinct values of the PIVOT Column
SELECT @ColumnName= ISNULL(@ColumnName + ',','')
+ QUOTENAME(ClickDate)
FROM (SELECT DISTINCT ClickDate FROM #t3 ) AS ClickDate order by ClickDate
--Get null replacements of the PIVOT Column
select @NullName = STUFF((SELECT ', IsNull(' + QUOTENAME(ClickDate)+', 0) as '+QUOTENAME(ClickDate)
from #t3
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
--Prepare the PIVOT query using the dynamic
SET @DynamicPivotQuery =
'SELECT BornDate, ' + @NullName + '
FROM #t3
PIVOT (SUM(Clicks)
FOR ClickDate IN (' + @ColumnName + ')) AS PVTTable order by 1, 2'
--Execute the Dynamic Pivot Query
EXEC sp_executesql @DynamicPivotQuery
见SQL Fiddle with Demo。这给出了最终结果:
| BORNDATE | 2014-11-18 | 2014-11-19 | 2014-11-20 | 2014-11-21 | 2014-11-22 | 2014-11-23|
|------------|------------|------------|------------|------------|------------|-----------|
| 2014-10-23 | 6 | 25 | 5 | 0 | 17 | 11 |
| 2014-10-24 | 6 | 1 | 3 | 3 | 0 | 2 |
答案 1 :(得分:3)
将零替换为零:
DECLARE @DynamicPivotQuery AS NVARCHAR(MAX)
DECLARE @ColumnName AS NVARCHAR(MAX)
DECLARE @ColumnNameSelect AS NVARCHAR(MAX)
--Get distinct values of the PIVOT Column
SELECT @ColumnName= ISNULL(@ColumnName + ',','')
+ QUOTENAME(ClickDate)
FROM (SELECT DISTINCT ClickDate FROM t3 ) AS ClickDate order by ClickDate
--Get distinct values of the PIVOT Column with isnull for zero values
SELECT @ColumnNameSelect= ISNULL(@ColumnNameSelect + ',','')
+ 'isnull(' + QUOTENAME(ClickDate) + ',0) as ' + QUOTENAME(ClickDate)
FROM (SELECT DISTINCT ClickDate FROM t3 ) AS ClickDate order by ClickDate
--Prepare the PIVOT query using the dynamic
SET @DynamicPivotQuery =
'SELECT BornDate, ' + @ColumnNameSelect + '
FROM t3
PIVOT (SUM(Clicks)
FOR ClickDate IN (' + @ColumnName + ')) AS PVTTable order by 1, 2'
--Execute the Dynamic Pivot Query
EXEC sp_executesql @DynamicPivotQuery