如何为我的数据编写数据透视查询

时间:2017-01-05 14:17:23

标签: sql sql-server sql-server-2008

我在数据库表中有以下数据

PageId  Values
289116  725
310235  453
310235  454
310235  455
281230  453
281230  454
281230  457
307818  453
308962  453
279437  557

根据我的应用程序提供的值列表,我需要找到所有pageID。 我写了样本Pivot查询

select pageid, [556],[1848]  from cmspageAttribute cpa
                            PIVOT
                            (
                                count([Value]) 
                                for Value in ([556],[1848])
                            ) as pvt
                            where Attribute = 'Content Identifier' and  [556]>0 and [1848]>0

例如,如果应用程序提供453,454,455,我的结果应该看起来像

PageId  453 454 455
310235   1   1   1

其余所有数据都应排除在外,因为我有where子句

但是我的数据透视查询给了我0条记录,因为有一个where子句正在为每列检查> ..

没有Where子句,它给我的数据如下

pageid  556 1848
302795  0   0
303258  0   0
303258  0   0
303258  0   0
285874  0   0
285874  0   0
285874  0   0
285874  0   0
290131  0   0
290131  0   0
290131  0   0
295127  1   0
303264  0   0
303265  1   0
303265  0   0
303265  0   0
284151  1   0
284346  0   0
281422  1   0
279874  1   0
281422  0   0
306670  0   1
306671  0   1
306672  0   1
306673  0   1
306716  0   1
289116  2   0

正如你所看到的,我正在获取pageId的多条记录....我想每页只有1条记录Id,我相信count(pageid)应该在那里。如果我计算(pageid),我不会选择

中的pageid

1 个答案:

答案 0 :(得分:0)

您需要使用动态sql

DECLARE @sql       VARCHAR(8000)='',
        @cols_list VARCHAR(8000)= '453,454,455'

SET @cols_list = '['+Replace(@cols_list, ',', '],[')+']'


SET @sql = 'SELECT PageId,'+@cols_list+'
            FROM   Yourtable
                   PIVOT ( Count ([Values])
                        FOR [Values] IN ('+@cols_list+') ) AS pvt
                          '
PRINT @sql

EXEC (@sql) 

更新:如果您要过滤所有列数大于0的记录,那么

示例数据

CREATE TABLE #Table2
    ([PageId] int, [Values] int)
;

INSERT INTO #Table2
    ([PageId], [Values])
VALUES
    (289116, 725),
    (310235, 453),
    (310235, 454),
    (310235, 455),
    (281230, 453),
    (281230, 454),
    (281230, 457),
    (307818, 453),
    (308962, 453),
    (279437, 557)
;

<强>查询:

DECLARE @sql          VARCHAR(8000)='',
        @cols_list    VARCHAR(8000)= ' 453, 454,455',
        @where_clause VARCHAR(8000)=''

SET @cols_list = '[' + Replace(@cols_list, ',', '],[') + ']'
SET @where_clause = 'Where ' + Replace(@cols_list, ',', '>0 and ') + '>0'


SET @sql = 'SELECT PageId,' + @cols_list
            + ' FROM  (select PageId,cast([Values] as int) as [Values] from #Table2) a
            PIVOT ( Count ([Values]) FOR [Values] IN (' + @cols_list + ') ) AS pvt
                                ' + @where_clause

PRINT @sql

EXEC (@sql) 

<强>结果:

+--------+------+------+-----+
| PageId |  453 |  454 | 455 |
+--------+------+------+-----+
| 310235 |    1 |    1 |   1 |
+--------+------+------+-----+