【问题标题】:Group/Aggregate on different values of a column in SQL在 SQL 中对列的不同值进行分组/聚合
【发布时间】:2016-02-03 21:30:01
【问题描述】:

数据库是 SQL Server 2008

表 A:

“标识符”列中的值:A、B、C、D、E、F “余额”列中的值:10、100、30、50、70、55

所需的结果集:

“Identifier_New”列中的值:Z、Y、X sum(Balances) 列中的值:40、170、105

总余额的逻辑映射:

标识符 A 和 C 的总和和组余额为 Z。 标识符 B 和 E 的总和和组余额为 Y。 标识符 D 和 E 的总和和组余额为 X。

我可以在单个 sql 中获得上述所需的结果集吗?

谢谢

【问题讨论】:

    标签: sql sql-server sum aggregate


    【解决方案1】:

    试试这个:

    SELECT x.v AS Identifier_New, SUM(Balances)
    FROM mytable
    CROSS APPLY (SELECT CASE Identifier
                          WHEN 'A' THEN 'Z'
                          WHEN 'C' THEN 'Z'
                          WHEN 'B' THEN 'Y'
                          WHEN 'E' THEN 'Y'
                          WHEN 'D' THEN 'X'
                          WHEN 'F' THEN 'X'
                        END ) AS x(v)
    GROUP BY x.v 
    

    Demo here

    【讨论】:

    • 不错的答案。这和我的有性能差异还是交叉应用本质上是简写?
    • @StanShaw 我认为在这种情况下CROSS APPLY 只是语法糖。两个查询应该具有相同的性能。
    • 感谢您的信息 - 我将阅读并开始使用它。
    【解决方案2】:
    SELECT CASE WHEN Identifier = 'A' or Identifier = 'C' THEN 'Z'
        WHEN Identifier = 'B' or Identifier = 'E' THEN 'Y'
        WHEN Identifier = 'D' or Identifier = 'F' THEN 'X' 
        END AS [Identifier_New],
        SUM(Balances) AS [Sum of Balances]
    FROM TABLE A
    GROUP BY CASE WHEN Identifier = 'A' or Identifier = 'C' THEN 'Z'
        WHEN Identifier = 'B' or Identifier = 'E' THEN 'Y'
        WHEN Identifier = 'D' or Identifier = 'F' THEN 'X' 
        END
    

    【讨论】:

    • 我尝试了 Stan 和 Giorgos 的两个答案,并且都运行良好。谢谢大家。
    猜你喜欢
    • 1970-01-01
    • 2020-05-03
    • 1970-01-01
    • 2013-08-06
    • 2023-04-02
    • 2020-11-09
    • 1970-01-01
    • 2017-05-07
    • 2023-01-20
    相关资源
    最近更新 更多