从动态查询中删除NULLS

时间:2015-01-09 21:15:29

标签: sql sql-server pivot

我无法从动态查询结果中删除空值。

以下是#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行。我想替换这些空值。

2 个答案:

答案 0 :(得分:4)

不是使用@ColumnName将值列表变为新列和最终选择列表,而是需要创建一个单独的列名列表,将null替换为零 - 类似于isnull(yourcol, 0) as yourcol

我通常使用FOR XMLSTUFF来连接我的列名,因此您可以使用:

--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

SQL FIDDLE