2015-01-09 56 views
3

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

这里是什么将成为#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年10月23日线在2014年11月21日列中的空值。再次为2014年10月24日在列中的2014年10月24日行。我想替换这些空值。

+0

你在你的'clicks'列得到一个NULL并要显示一个零呢?尝试使用'SUM(COALESCE(Clicks,0))' – laylarenee 2015-01-09 21:23:00

+0

@laylarenee我相信-lee要求结果集没有任何空值。 – 2015-11-18 13:39:18

回答

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