【问题标题】:combining multiple rows into 1将多行合并为 1
【发布时间】:2018-01-11 11:12:56
【问题描述】:

我有一张桌子,上面有另一所学校的课程,这些课程与我们学校的相应课程相关。这是一对多的关系 我正在尝试根据转校的课程将所有内容排成一行 例如

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 主题艺术 crsenum 100 在我们学校还有一门课程绘图 200 - 我希望它给我

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

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

【问题讨论】:

  • 您使用的是什么 rdbms?如果超过 2 行会怎样?
  • 您使用的是什么查询?当你说你得到两行时,ourcrsnum1ourcrsnum2 是否相同,但交换了值?
  • 啊,我想我明白你在做什么了,你想把所有匹配的课程都编译成一行吗?例如,crsenum 为 100 的所有课程都有任意数量的 oursubjourcrsenum 列,具体取决于行数? (不知道我的措辞是不是很清楚)
  • 这是 oursubj 和 ourcrsenum 的一个支点。可以通过多种方式处理 Pivot。但是只有在要创建的列数是静态的情况下,pivot 才有效。如果不意味着要组合的行数可能是“N”,那么您需要动态 SQL 来处理未知数量的列。我会注意到,以这种方式转换数据通常在表示层中做得更好。 DB 的存储、检索和聚合数据;它们真的不是为了让数据看起来更漂亮。
  • 您使用的是哪个DBMS?后格雷斯?甲骨文? DB2?火鸟?

标签: sql oracle pivot oracle-sqldeveloper crosstab


【解决方案1】:
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

【讨论】:

    猜你喜欢
    • 2017-06-21
    • 2022-01-13
    • 1970-01-01
    • 2021-10-24
    • 2021-10-06
    • 2023-03-05
    • 2012-06-26
    • 1970-01-01
    相关资源
    最近更新 更多