Мой запрос SUM возвращает 2 строки, нужен совет - PullRequest
0 голосов
/ 12 июля 2020

Я получаю 2 строки (9500) на 111 в результате, не могли бы вы посоветовать правильный подход, мне нужно нравится, Баланс = (сумма купленных - сумма проданных)

#Table T1#  
+---------+--------+------+------+  
| ACCOUNT | TRANS  | AMT  | YEAR |  
+---------+--------+------+------+  
|     111 | BOUGHT | 8000 | 2019 |  
|     111 | BOUGHT | 2000 | 2019 | 
|     111 | SOLD   |  500 | 2019 |  
|     222 | BOUGHT | 6000 | 2018 |  
|     222 | SOLD   |  300 | 2018 |  
+---------+--------+------+------+ 

Запрос

SELECT (A.BOUGHTs - B.SOLDs) AS BALANCE  
  FROM T1 
 INNER JOIN  
  (SELECT SUM(AMT) AS BOUGHTs  
     FROM T1  
    WHERE TRANS = 'BOUGHT'  
  ) A  
   ON T1.ACCOUNT = A.ACCOUNT  
 INNER JOIN  
  (SELECT SUM(AMT) AS SOLDs  
     FROM T2  
    WHERE TRANS = 'SOLD'  
  ) B  
   ON T1.ACCOUNT = B.ACCOUNT  
WHERE T1.ACCOUNT = 111  
  AND T1.YEAR    = 2019 

Ответы [ 2 ]

0 голосов
/ 12 июля 2020

Переписывание вашего запроса будет выглядеть так:

SELECT (A.BOUGHTs - B.SOLDs) AS BALANCE
  FROM
    (SELECT ACCOUNT,YEAR,SUM(AMT) AS BOUGHTs FROM T1 WHERE TRANS = 'BOUGHT' GROUP BY ACCOUNT,YEAR) A
    INNER JOIN
    (SELECT ACCOUNT,YEAR,SUM(AMT) AS SOLDs FROM T1 WHERE TRANS = 'SOLD' GROUP BY ACCOUNT,YEAR) B
    ON A.ACCOUNT=B.ACCOUNT AND A.YEAR=B.YEAR
WHERE A.ACCOUNT = 111
  AND A.YEAR    = 2019;
0 голосов
/ 12 июля 2020

Вы можете использовать условную агрегацию:

select account, year,
       sum(case when trans = 'bought' then amt 
                when trans = 'sold' then - amt
                else 0
           end) as diff
from t
group by account, year;

Если вы хотите, чтобы это было только для одной учетной записи, вы можете добавить предложение where:

select account, year,
       sum(case when trans = 'bought' then amt 
                when trans = 'sold' then - amt
                else 0
           end) as diff
from t
where account = 111 and year = 2019
group by account, year;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...