SQl 服务器透视查询(简单分组依据?



如何在SQL Server中对以下结果集进行透视:

Source      Type    Count   Sum
--------------------------------------
Apple       FALSE   67      153981
Egg         FALSE   115     75821
Egg         TRUE    832     112773
Jam         FALSE   81      71758
Jam         TRUE    648     85784
Other       FALSE   1228    521206
Other       TRUE    2       282
Pineapple   FALSE   521     1292074
Pineapple   TRUE    698     146585
Watermelon  FALSE   1146    1815607
Watermelon  TRUE    4157    761837

我的最终结果应该是这样的。我认为这不能通过简单的分组来完成,如果我是对的?

Source      TRUE    FALSE   Sum
--------------------------------------
Apple       0       67      153981
Egg         832     115     188594
Jam         648     81      157542
Other       2       1228    521488
Pineapple   698     521     1438659
Watermelon  1146    4175    2577444

感谢您的帮助!

您可以使用条件聚合来执行此操作:

SELECT
    [Source],
    [True]  = SUM(CASE WHEN [Type] = 'TRUE' THEN [Count] ELSE 0 END),
    [False] = SUM(CASE WHEN [Type] = 'FALSE' THEN [Count] ELSE 0 END),
    [Sum]   = SUM([Sum])
FROM tbl
GROUP BY [Source]

作为旁注,应避免使用保留字(如 COUNTSUM)作为列名。

可能是使用 PIVOT 回答相同结果集的另一种方法

DECLARE @Table1 TABLE 
    (Source varchar(10), Type varchar(5), Count int, Sum int)
;
INSERT INTO @Table1
    (Source, Type, Count, Sum)
VALUES
    ('Apple', 'FALSE', 67, 153981),
    ('Egg', 'FALSE', 115, 75821),
    ('Egg', 'TRUE', 832, 112773),
    ('Jam', 'FALSE', 81, 71758),
    ('Jam', 'TRUE', 648, 85784),
    ('Other', 'FALSE', 1228, 521206),
    ('Other', 'TRUE', 2, 282),
    ('Pineapple', 'FALSE', 521, 1292074),
    ('Pineapple', 'TRUE', 698, 146585),
    ('Watermelon', 'FALSE', 1146, 1815607),
    ('Watermelon', 'TRUE', 4157, 761837)
;
Select  Source,
        ISNULL(MAX([TRUE]),0)[TRUE],
        ISNULL(MAX([FALSE]),0)[FALSE],
        ISNULL(MAX(SUM),0)SUM 
FROM (
Select Source,Sum,[TRUE],[FALSE]    
    from (
select Source, Sum,Count,Type 
    from @Table1)T
PIVOT (MAX(Count) FOR   
        Type IN([TRUE],[FALSE]) )P)TT
GROUP BY TT.Source

最新更新