Skip to content
Advertisement

My SUM query returns 2 rows, need some advise

I am getting 2 rows(9500) for 111 in the result, could you please advise on the right approach, I need like, Balance = (sum of bought – sum of sold)

#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 |  
+---------+--------+------+------+ 

Query

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 

Advertisement

Answer

You can use conditional aggregation:

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;

If you want this for only one account, you can add a where clause:

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