【问题标题】:how to separate and sum 2 columns based on condition如何根据条件分离和求和 2 列
【发布时间】:2018-08-07 20:24:22
【问题描述】:

我正在做一个选择语句,我有一列我想根据它们的类型分成 2 列,然后得到按 ID 分组的金额的总和

我想要一列中的所有黄金和铂金类型,第二列中的所有银和青铜类型,然后按 ID 汇总和分组,如下所示:

我尝试过这样的联合:

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

金/铂金栏是正确的,但青铜/银栏我什么都没有

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    使用条件聚合:

    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;
    

    【讨论】:

    • 呵呵领先我几秒钟。 :D
    • 成功了!我想我必须做一个案例,但我无法理解逻辑。这很有意义,谢谢。
    【解决方案2】:

    你可以在 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 |
    +----+---------------+---------------+
    

    【讨论】:

      猜你喜欢
      • 2016-07-09
      • 2021-01-25
      • 1970-01-01
      • 2021-10-12
      • 2021-05-05
      • 1970-01-01
      • 2019-10-20
      • 2019-02-02
      相关资源
      最近更新 更多