Sql 列中的数据而不是行中的数据
我想在一个程序中显示模块,与程序一起显示为一行,而不是为每个程序显示多行模块Sql 列中的数据而不是行中的数据,sql,oracle,Sql,Oracle,我想在一个程序中显示模块,与程序一起显示为一行,而不是为每个程序显示多行模块 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
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
生成:
如何使其显示为这样:您可以这样做:
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
您可以这样做:
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
我在这儿拉小提琴
sqlfiddle here如果需要单独的列,而不是单个逗号分隔的列,可以使用pivot。11g中有一个内置的pivot命令;或者你也可以用老式的方式:
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;
无论哪种方式,您都需要知道可能有多少个模块,并对它们进行处理(在此版本中添加更多case语句)
.如果需要单独的列,而不是单个逗号分隔的列,可以使用透视。11g中有一个内置的pivot命令;或者你也可以用老式的方式:
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;
无论哪种方式,您都需要知道可能有多少个模块,并对它们进行处理(在此版本中添加更多case语句)
.您使用的是什么数据库?您希望数据以单独的列显示,还是以逗号分隔的字符串(如编程、网络等)显示在一列中?Oracle编辑:对不起,我准备好了日期、单独的列。您使用的是什么数据库?您希望数据在单独的列中还是在一列中使用逗号分隔的字符串(如编程、网络等)?Oracle编辑:抱歉,我准备好将其作为日期、单独的列。