将多行合并为1

时间:2017-08-03 17:38:12

标签: sql oracle pivot oracle-sqldeveloper crosstab

我有一张桌子,上面有另一所学校的课程,这些课程与我们学校的相应课程相关。它是一对多的关系 我试图根据转学校的课程在一条线上排队 例如

schoolcode | subj | crsenum  |  oursubj  |  ourcrsenum
------------------------------------------------------
1234       | Art  | 100      |  VisArt   |     200
1234       | Art  | 100      |  VisArt   |     201

我试图获得的结果是

schoolcode | subj | crsnum  | oursubj1   | ourcrsnum1  |  oursubj2 | ourcrsnum2
--------------------------------------------------------------------------------
1234       | Art  | 100     | VisArt     |    200      |  VisArt   |  201

我所尝试过的每个转学课程仍然给我两行 在表格中还有一个序列号,对应于每个添加的课程,附加到一个传入的课程 任何帮助将不胜感激! 谢谢

我道歉... 我在oracle / sqldeveloper工作 这是来自一个表的信息,我只是试图选择它并将其展平为一行,其中键是schoolcode | subj | crsenum 然后添加到该行,我们与该课程相关的所有课程。如果有超过2个,我想将它添加到同一行 所以,例如,如果对于学校1234 subj Art crsenum 100,我们学校还有一个200线的课程 - 我希望它能给我

1234     |  Art  | 100 | VisArt  | 200   | VisArt  | 201 | Drawing | 200

我希望这是有道理的 这是我的第一个问题

1 个答案:

答案 0 :(得分:0)

DECLARE @sql VARCHAR(MAX)
DECLARE @tbl VARCHAR(100)

SET @tbl = 'courses' -- put your table name here

SET @sql = 'SELECT schoolcode, subj, crsenum, ' 

SELECT @sql = @sql + ''''+ oursubj + '''' + ' AS oursubj' + CAST(ROW_NUMBER() OVER (ORDER BY ourcrsenum) AS VARCHAR) + ', ' + CAST(ourcrsenum AS VARCHAR) + ' AS crsenum' + CAST(ROW_NUMBER() OVER (ORDER BY ourcrsenum) AS VARCHAR) + ', '
  FROM courses

SET @sql = LEFT(@sql, LEN(@sql) - 1)

SET @sql = @sql + ' FROM ' + @tbl + ' GROUP BY schoolcode, subj, crsenum'

EXEC(@sql)

结果

schoolcode | subj | crsenum | oursubj1 | crsenum1 | oursubj2 | crsenum2
1234       | Art  | 100     | VisArt   | 200      | VisArt   | 201