【问题标题】:One select statement with multiple Group BY on the same column在同一列上具有多个 Group BY 的一个 select 语句
【发布时间】:2019-01-26 19:07:00
【问题描述】:

我有这样的“TABLE_A”:

TVA  Amount   InvoiceID
----------------------
22  | 10.00 | inv-12
22  |-14.00 | inv-13
25  | 24.00 | inv-14
25  |-36.00 | inv-15
25  |-25.00 | inv-16
25  | 18.50 | inv-17
24  |-16.50 | inv-18
24  | 10.00 | inv-19

目标是使 groupBy TABLE_A.TVA 值和 SUM(TABLE_A.Amount) > 0 和 SUM(TABLE_A.Amount)

我的查询是这样的:

SELECT TABLE_A.TVA, TABLE_A.InvoiceID,
       SUM(TABLE_A.Amount) AS [PositiveTotalAMount],
       SUM(TABLE_A.Amount) AS [NegativeTotalAMount]  

 FROM TABLE_A
 GROUP BY TABLE_A.TVA
 HAVING SUM(TABLE_A.TVA) > 0

我的问题是如何在负值上添加第二个分组,因为这里我只在 SUM() > 0 上分组

【问题讨论】:

    标签: sql sql-server select group-by


    【解决方案1】:

    您可以使用CASE (Transact-SQL) 表达式:

    SELECT
        A.TVA,
        A.InvoiceID,
        SUM(CASE WHEN A.Amount > 0 THEN A.Amount ELSE 0 END) AS [PositiveTotalAMount],
        SUM(CASE WHEN A.Amount < 0 THEN A.Amount ELSE 0 END) AS [NegativeTotalAMount]
    FROM
        TABLE_A A
    GROUP BY
        A.TVA,
        A.InvoiceID
    

    此外,您必须包括选择列表中未聚合到 GROUP BY 列表的所有列。 InvoiceID 不见了。

    我还为TABLE_A 使用别名A 以提高可读性。

    【讨论】:

    • case 表达式在THEN 中返回正数或负数,否则在ELSE 中返回0,在这种情况下,它的总和为 0。即,对每条记录执行 SUM 函数将金额相加或相加 0。
    【解决方案2】:

    使用条件聚合:

    SELECT 
      TABLE_A.TVA, 
      SUM(CASE WHEN TABLE_A.Amount > 0 THEN TABLE_A.Amount ELSE 0 END) AS [PositiveTotalAMount],
      SUM(CASE WHEN TABLE_A.Amount < 0 THEN TABLE_A.Amount ELSE 0 END) AS [NegativeTotalAMount]  
     FROM TABLE_A
     GROUP BY TABLE_A.TVA
    

    如果你想在分组中包含TABLE_A.InvoiceID 列,那么:

    SELECT 
      TABLE_A.TVA, 
      TABLE_A.InvoiceID, 
      SUM(CASE WHEN TABLE_A.Amount > 0 THEN TABLE_A.Amount ELSE 0 END) AS [PositiveTotalAMount],
      SUM(CASE WHEN TABLE_A.Amount < 0 THEN TABLE_A.Amount ELSE 0 END) AS [NegativeTotalAMount]  
     FROM TABLE_A
     GROUP BY TABLE_A.TVA, TABLE_A.InvoiceID
    

    【讨论】:

      猜你喜欢
      • 2012-08-03
      • 2011-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多