首页 > 解决方案 > 数据透视表中的 SQL 分组

问题描述

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

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

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

标签: sqlsql-server

解决方案


您需要更改子查询中的x查询。

因为使用 aselect *您还可以从其中的该表中拖动其他字段。
其中一些不是每个 (ref, offer_cover_id) 元组唯一的。

所以改成:

select Ref, offer_cover_id, Offer_cover, cover_earning_Count
from #cover2 

推荐阅读