Skip to content
Advertisement

One select statement with multiple Group BY on the same column

I have ‘TABLE_A’ like this:

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

The goal is to make a groupBy TABLE_A.TVA value and by SUM(TABLE_A.Amount) > 0 and SUM(TABLE_A.Amount) <0, to get finally the sum of all positive Amounts grouped by TVA value, and the sum of all negative amounts grouped by their TVA value also

my Query is like this:

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

MY question is how to add the second grouping by on negative values, because here i group only on SUM() > 0

Advertisement

Answer

With conditional aggregation:

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

If you want to include the column TABLE_A.InvoiceID in the grouping then:

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
User contributions licensed under: CC BY-SA
8 People found this is helpful
Advertisement