x
SELECT * FROM INVOICE;
id | amount |
---|---|
1 | 20 |
2 | 20 |
3 | 20 |
4 | 30 |
5 | 100 |
6 | 20 |
7 | 30 |
8 | 100 |
I would like to create three more columns which will be calculated by the amount column.
openamt = Sum of amount
debamt = Sum of amount where amount < 50
credamt = Sum of amount where amount > 50
closeamt = openamt - debamt + credamt
Expected output:
id | amount | openamt | debamt | credamt | closeamt |
---|---|---|---|---|---|
1 | 20 | 340 | 140 | 200 | 400 |
2 | 20 | 340 | 140 | 200 | 400 |
3 | 20 | 340 | 140 | 200 | 400 |
4 | 30 | 340 | 140 | 200 | 400 |
5 | 100 | 340 | 140 | 200 | 400 |
6 | 20 | 340 | 140 | 200 | 400 |
7 | 30 | 340 | 140 | 200 | 400 |
8 | 100 | 340 | 140 | 200 | 400 |
What I tried, I got it working for openamt
but not for the rest. Can somebody point out me to the right direction, please?
SELECT
ID,
AMOUNT,
SUM(AMOUNT) OVER () AS OPENAMT,
(SELECT SUM(AMOUNT) FROM INVOICE WHERE AMOUNT < 0) AS DEBTAMT, -- This is how I want
(SELECT SUM(AMOUNT) FROM INVOICE WHERE AMOUNT > 0) AS CREDAMT, -- This is how i want
(OPENAMT - DEBTAMT + CREDAMT) AS CLOSEAMT
FROM
INVOICE
Advertisement
Answer
You were in the right area. You can use a conditional aggregation within the window function sum() over()
Example
Declare @YourTable Table ([id] int,[amount] int) Insert Into @YourTable Values
(1,20)
,(2,20)
,(3,20)
,(4,30)
,(5,100)
,(6,20)
,(7,30)
,(8,100)
Select *
,openamt = sum(amount) over()
,debamt = sum( case when amount<50 then amount end) over()
,credamt = sum( case when amount>=50 then amount end) over()
,closeamt = sum(amount) over()
-sum( case when amount<50 then amount end) over()
+sum( case when amount>=50 then amount end) over()
From @YourTable
Results