如何根据条件分离和求和2列

时间:2018-08-07 20:24:23

标签: sql sql-server

我正在执行一条select语句,我想根据其类型将其分为两列,然后获取按ID分组的金额之和

table1

我希望将所有类型的黄金和铂金放在一列中,将所有银和青铜类型放在第二列中,然后按ID进行汇总和分组,使其看起来像这样:

enter image description here

我试图做这样的工会:

SELECT 
    ID, 
    SUM(Amount) AS "Gold/Platinum",
    0 AS "Bronze/Silver"
FROM 
    table
WHERE 
    Type IN ('gold', 'platinum')
GROUP BY 
    ID

UNION ALL

SELECT 
    ID, 
    SUM(Amount) AS "Bronze/Silver",
    0 AS "Gold/Platinum"
FROM 
    table
WHERE 
    Type IN ('bronze', 'silver')
GROUP BY 
    ID

“金/铂”一栏是正确的,但“铜/银”一栏我什么也没得到

2 个答案:

答案 0 :(得分:3)

使用条件聚合:

select id,
       sum(case when Type in ('gold', 'platinum') then amount else 0 end) as gold_platinum,
       sum(case when Type in ('bronze', 'silver') then amount else 0 end) as bronze_silver
from t
group by id
order by id;

答案 1 :(得分:0)

您可以在SSMS中运行它:

   DECLARE @data TABLE( [ID] INT, [Type] VARCHAR(10), [Amount] INT );

    INSERT INTO @data ( [ID], [Type], [Amount] ) VALUES
    ( 1, 'gold', 100 )
    , ( 1, 'gold', 50 )
    , ( 1, 'bronze', 75 )
    , ( 2, 'silver', 10 )
    , ( 2, 'bronze', 20 )
    , ( 3, 'gold', 35 )
    , ( 4, 'silver', 20 )
    , ( 4, 'platinum', 30 );

    SELECT
        [ID]
        , SUM( CASE WHEN [Type] IN ( 'gold', 'platinum' ) THEN Amount ELSE 0 END ) AS [Gold/Platinum]
        , SUM( CASE WHEN [Type] IN ( 'bronze', 'silver' ) THEN Amount ELSE 0 END ) AS [Bronze/Silver]
    FROM @data
    GROUP BY [ID]
    ORDER BY [ID];

返回

+----+---------------+---------------+
| ID | Gold/Platinum | Bronze/Silver |
+----+---------------+---------------+
|  1 |           150 |            75 |
|  2 |             0 |            30 |
|  3 |            35 |             0 |
|  4 |            30 |            20 |
+----+---------------+---------------+