Reputation: 3
I have problem with selecting sum of balances for specific Acc, Nam for a given period.
SELECT Acc, Nam, SUM(Bal) FROM table WHERE
MAX(Par) = (SELECT Par WHERE Acc IN (101,102) AND Dat >1105 AND Dat <1405)
AND Acc IN (101,102) AND Dat >1105 AND Dat <1405
GROUP BY Acc, Nam
Acc --- Nam --- Bal --- Par --- Dat
101 --- One --- 150 --- 131 --- 1205
101 --- One --- 120 --- 132 --- 1205
101 --- One --- 160 --- 133 --- 1305
102 --- Two --- 190 --- 121 --- 1205
102 --- Two --- 110 --- 122 --- 1305
102 --- Two --- 150 --- 123 --- 1305
The final output should be:
Acc --- Nam --- Bal
101 --- One --- 280
102 --- Two --- 340
So it will sum of all balances within the period separated by Account and Account Name. Only balances with the highest Par number per day should sum in total. Please advise.
UPDATE
I did it with below row_number method but what i received is just the total of all rows (without some of them). Below is the code which is showing: two accounts, two account descriptions, parameters, dates and balance. I would like to see two lines which will be the sum of all dates in a range for given account with the highest parameter number in a separate day. Final output shoul be only three columns: account, name and balance. This query should be able to chose max parameter of each day and sum all of these max values to one account.
SELECT h.account, h.name, h.paramet, h.date, h.balance
FROM h
WHERE TRUNC(h.date) > '01-Jun-16' AND TRUNC(h.date) < '10-Jun-16'
AND h.account IN ('410212','410213')
AND h.fund LIKE 'SSPSP
Upvotes: 0
Views: 2396
Reputation: 3
I have next question related to above query. How can I create one table with two SUM(Bal) columns with different Date for each other:
Acc --- Nam --- Bal(Dat1) -- Bal(Dat2)
101 --- One ------- 280 ---------- 300
102 --- Two ------- 340 ---------- 180
SELECT Acc, Nam, SUM(Bal)
FROM (SELECT t.*,
ROW_NUMBER() OVER (PARTITION BY Acc, Nam, TRUNC(Dat) ORDER BY Par DESC) as seqnum
FROM table t
WHERE Acc IN (101,102) AND Dat = 1105
) t
WHERE seqnum = 1
GROUP BY Acc, Nam;
SELECT Acc, Nam, SUM(Bal)
FROM (SELECT t.*,
ROW_NUMBER() OVER (PARTITION BY Acc, Nam, TRUNC(Dat) ORDER BY Par DESC) as seqnum
FROM table t
WHERE Acc IN (101,102) AND Dat = 1405
) t
WHERE seqnum = 1
GROUP BY Acc, Nam;
Upvotes: 0
Reputation: 1271151
You can use row_number()
for this:
SELECT Acc, Nam, SUM(Bal)
FROM (SELECT t.*,
ROW_NUMBER() OVER (PARTITION BY Acc, Nam, Dat ORDER BY Par DESC) as seqnum
FROM table t
WHERE Acc IN (101,102) AND Dat > 1105 AND Dat < 1405
) t
WHERE seqnum = 1
GROUP BY Acc, Nam;
Upvotes: 2