Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 列中的数据而不是行中的数据_Sql_Oracle - Fatal编程技术网

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编辑:抱歉,我准备好将其作为日期、单独的列。