我创建了一个数据透视表,但是数据并没有分组在一起。 谁能帮助我获得所需的格式?
我为获取数据透视表而编写的查询:
DECLARE @cols AS NVARCHAR(MAX), -- for pivot
@cols2 AS NVARCHAR(MAX), -- for select
@query AS NVARCHAR(MAX);
SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.[Offer_cover])
FROM #cover2 c
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
-- this is for the SELECT
SET @cols2 = STUFF((SELECT ',' + 'ISNULL(' + QUOTENAME(c.[Offer_cover]) + ', 0) ' + QUOTENAME(c.[Offer_cover])
FROM #cover2 c
GROUP BY c.[Offer_cover] -- changes here
ORDER BY c.[Offer_cover]
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT Ref,offer_cover_id, ' + @cols2 + ' from
(
select *
from #cover2
) x
pivot
(
SUM(cover_earning_Count)
for [Offer_cover] in (' + @cols + ')
) p'
execute( @query)
实际结果:
Ref offer_cover_id 6667 13333 20000 26667 33333
42186_43252 1 0 0 0 0 1
42186_43252 1 0 0 0 0 0
42186_43252 1 1 0 0 0 0
42186_43252 1 0 1 0 0 0
42186_43252 1 0 0 0 2 0
42186_43252 1 0 0 0 0 0
42186_43252 1 0 0 0 0 0
42217_43252 1 0 1 0 0 0
42217_43252 1 0 0 1 0 0
42217_43252 1 0 0 0 0 0
42217_43252 1 0 0 0 0 0
42217_43252 1 0 0 0 0 0
42217_43252 1 0 0 0 0 0
42217_43252 1 0 0 0 0 0
42217_43252 1 0 0 0 0 0
42217_43252 1 0 0 0 0 0
42217_43252 1 0 0 0 0 0
所需的输出:
Ref offer_cover_id 6667 13333 20000 26667 33333
42186_43252 1 1 1 0 2 1
42217_43252 1 0 1 1 0 0
答案 0 :(得分:2)
您需要在x
子查询中更改查询。
因为有了select *
,您还从表中拖动了其他字段。
其中一些不是每个(ref,offer_cover_id)唯一的。
因此将其更改为:
select Ref, offer_cover_id, Offer_cover, cover_earning_Count
from #cover2
答案 1 :(得分:2)
任何传递到PIVOT
且未聚合的列都将成为分组的一部分,因此,既然您已经拥有了
from
(
select *
from #cover2
) x
您将按#cover
中除cover_earning_Count
和Offer_cover
以外的所有列进行分组,解决方案是仅选择所需的列(这是一个很好的规则仍然是拇指):
set @query = 'SELECT Ref,offer_cover_id, ' + @cols2 + ' from
(
select Ref,offer_cover_id, cover_earning_Count, Offer_cover
from #cover2
) x
pivot
(
SUM(cover_earning_Count)
for [Offer_cover] in (' + @cols + ')
) p'
顺便说一句,您可以在单个语句中设置两个列变量。我认为这不会增加很多性能,但是一点点帮助:
SELECT @Cols = STUFF(x.Cols.query('Col1').value('.', 'NVARCHAR(MAX)'), 1, 1, ''),
@Cols2 = STUFF(x.Cols.query('Col2').value('.', 'NVARCHAR(MAX)'), 1, 1, '')
FROM (
SELECT Col1 = ',' + QUOTENAME(c.[Offer_cover]),
Col2 = ',ISNULL(' + QUOTENAME(c.[Offer_cover]) + ', 0) ' + QUOTENAME(c.[Offer_cover])
FROM #cover2 c
GROUP BY c.[Offer_cover] -- changes here
ORDER BY c.[Offer_cover]
FOR XML PATH(''), TYPE
) x (Cols);