数据透视表中的SQL分组

时间:2018-08-09 08:34:50

标签: sql sql-server

我创建了一个数据透视表,但是数据并没有分组在一起。 谁能帮助我获得所需的格式?

我为获取数据透视表而编写的查询:

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

2 个答案:

答案 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_CountOffer_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);