Reputation: 3041
I need help with combining two rows with following requirements (it's easier to demonstrate with tables..):
My schema looks like this:
project table:
project_id | name
--------------------------------
1 Project1
2 Project2
3 Project3
project_program table
id | project_id | program_id
-----------------------------------
1 1 1
2 1 2
2 3 2
program table:
program_id | type | name
---------------------------------------
1 A test
2 B production
desired output for select statement:
project_id | name | A | B
-------------------------------------------------------------------
1 Project1 test production
2 Project2 (null) (null)
2 Project3 (null) production
This is what I've managed to achieve so far:
SELECT
project.*,
CASE WHEN program.type LIKE 'A' THEN program.name ELSE NULL END AS A,
CASE WHEN program.type LIKE 'B' THEN program.name ELSE NULL END AS B
FROM
project
LEFT JOIN project_program ON project.project_id = project_program.project_id
LEFT JOIN program ON project_program.program_id = program.program_id
It's close but not quite. Now my result looks like this:
project_id | name | A | B
-------------------------------------------------------------------
1 Project1 test (null)
1 Project1 (null) production
2 Project2 (null) (null)
3 Project3 (null) production
I'm using Oracle 11g.
Upvotes: 1
Views: 1205
Reputation: 6426
you can probably just agregate what you have - something like:
SELECT id, name, max(A) A, max(b) B
FROM (
SELECT
project.id, Project.name,
CASE WHEN program.type LIKE 'A' THEN program.name ELSE NULL END AS A,
CASE WHEN program.type LIKE 'B' THEN program.name ELSE NULL END AS B
FROM
project
LEFT JOIN project_program ON project.project_id = project_program.project_id
LEFT JOIN program ON project_program.program_id = program.program_id
) X
GROUP BY id, name
Upvotes: 2