SQL数据透视表动态 - 排除未使用的列

时间:2015-03-12 09:34:46

标签: sql-server pivot

我有以下SQL代码,可以创建一个非常有用的数据透视表:

Use [A1_20132014]

DECLARE @cols NVARCHAR (MAX)

SELECT @cols = COALESCE (@cols + ',[' + Link_ID + ']', '[' + Link_ID + ']')
               FROM    (SELECT DISTINCT Link_ID FROM A1) PV  
               ORDER BY Link_ID

DECLARE @query NVARCHAR(MAX)
SET @query = 'SELECT * FROM 
             (
                 -- We will select the data that has to be shown for pivoting
                 SELECT date_1, StartHour,Cost, Link_ID
                 FROM A1
                 WHERE Section = (''1AB'')
             ) x
             PIVOT 
             (
                 -- Values in each dynamic column
                 SUM(Cost)
                 -- Select columns from @cols 
                 FOR Link_ID IN (' + @cols + ')                      
            ) p;' 

EXEC SP_EXECUTESQL @query

来自这些标题

       link_id       Section   date_1     StartHour   Cost    data_source
   4000000027866016A   8NB    2013-09-02    6         5871        1
   4000000027866017B   5EB    2013-10-09    9         8965        2
   4000000027856512B   4TB    2013-05-06    15        6754        1
   4000000027866015A   6HB    2013-06-08    8         5354        1
   4000000027866011A   1AB    2013-06-09    11          2         1

使用这些源类型;

    link_Id         nvarchar(50)    
    Section         nvarchar(50)    
    Date_1          smalldatetime   
    StartHour       int 
    Cost            float    
    data_source     int

然而,尽管WHERE子句指定某个部分,但不幸的是,所有部分仍然出现在数据透视表中,但是一直填充NULL值。

有没有办法完全排除不符合WHERE子句的列?

感谢您的帮助。

亨利。

1 个答案:

答案 0 :(得分:0)

将where子句放在子查询中。这样,您只会获得适用于1AB的列

SELECT @cols = COALESCE (@cols + ',[' + Link_ID + ']', '[' + Link_ID + ']')
               FROM    (SELECT DISTINCT Link_ID FROM A1 WHERE Section = '1AB') PV  
               ORDER BY Link_ID