Один оператор выбора с несколькими группами BY в одном столбце - PullRequest
0 голосов
/ 26 января 2019

У меня есть «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) <0, чтобы получить, наконец, сумму всех положительных сумм, сгруппированных по значению TVA, и сумма всех отрицательных сумм, сгруппированных по значению TVA, также </p>

Мой запрос выглядит так:

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

Ответы [ 2 ]

0 голосов
/ 26 января 2019

Вы можете использовать выражение 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 отсутствует.

Я также использую псевдоним A для TABLE_A, чтобы повысить удобочитаемость.

0 голосов
/ 26 января 2019

с условной агрегацией:

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
...