繁体   English   中英

从动态查询中删除NULLS

[英]Remove NULLS from dynamic query

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

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

您不需要将@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 |

要用零替换空值:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM