- Database: Postgres
- Table name:
records
- Has 4 columns
Year | Dept | Expense | Month
So per year there can be up to one record for each month / per department.
I have a sub-query which returns me the below data based on constraints.
x
Year | Dept
2001 | HR
2001 | ACC
2001 | TECH
2002 | TECH
2003 | HOUSE-KEEPING
2003 | TECH
Now I need to run another query on the same table to get a total of the expenses for each value pair.
Using the output of the subquery, my main query will be something like
select Dept, sum(Expense)
from records
where (Year, Dept) in ( )
I want to iterate over value pairs from the subquery
(SUBQUERY which returns
Year | Dept
2001 | HR
2001 | ACC
2002 | TECH
2003 | HOUSE-KEEPING
)
When I run this select statement, the output returned is only containing data for TECH across all three years.
Please can help understand how I can run the main select over all the rows of the subquery
Advertisement
Answer
Refactor the subquery to a join.
Say you have
SELECT a, b FROM t1 WHERE (x,y) IN (SELECT x1, y1 FROM t2 WHERE )
which won’t work. You rewrite to
SELECT a, b
FROM t1
INNER JOIN (
-- subquery here:
SELECT x1, y1
FROM t2
WHERE
) AS some_alias
WHERE t1.x = some_alias.x1
AND t1.y = some_alias.y1;
Note, in PostgreSQL you shouldn’t use a CTE (WITH query) for this.
You can abbreviate
WHERE t1.x = some_alias.x1
AND t1.y = some_alias.y1;
to
WHERE (x, y) = (x1, y1)
though.