我在数据库表中有以下数据
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答案 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 |
+--------+------+------+-----+