Question

I would like to display the modules in a program, along side the program as one row, instead of having multiple rows of modules for each program.

    SELECT program.program_title as program, course_module.title as unit
    FROM program_module
    INNER JOIN program
        ON program_module.program_id = program.id
    INNER JOIN course_module 
        ON program_module.course_module_id = course_module.id

Generates: https://dl.dropboxusercontent.com/u/23413810/Stack/current.png

How can I get it to appear as this: https://dl.dropboxusercontent.com/u/23413810/Stack/desired.png

Was it helpful?

Solution 2

select p.program_title, 
listagg(m.module_title,',') within group (order by m.module_id) as module_title
from program_module pm
inner join program p on pm.program_id = p.program_id
inner join module m on pm.module_id = m.module_id
group by p.program_title

sqlfiddle here http://sqlfiddle.com/#!4/d3652/5

OTHER TIPS

If you want separate columns, rather than a single comma-separated column, you could use a pivot. From 11g there is a built in pivot command; or you can do it the old-fashioned way:

SELECT program,
    MAX(CASE WHEN pos = 1 THEN unit END) AS unit1,
    MAX(CASE WHEN pos = 2 THEN unit END) AS unit2,
    MAX(CASE WHEN pos = 3 THEN unit END) AS unit3,
    MAX(CASE WHEN pos = 4 THEN unit END) AS unit4
FROM (
  SELECT program.id as program_id,
      program.program_title as program,
      course_module.title as unit,
      row_number() over (partition by program.id
          order by course_module.title) as pos
    FROM program_module
    INNER JOIN program
        ON program_module.program_id = program.id
    INNER JOIN course_module 
        ON program_module.course_module_id = course_module.id
)
group by program_id, program
order by program;

Either way you need to know how many modules are possible, and have handling for them all (adding more case statements with this version).

SQL Fiddle.

You can do it like this :

SELECT program.program_title as program, LISTAGG(course_module.title, ',') WITHIN GROUP (ORDER BY course_module.title) as unit
FROM program_module
INNER JOIN program
    ON program_module.program_id = program.id
INNER JOIN course_module 
    ON program_module.course_module_id = course_module.id
GROUP BY program.program_title
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top