【问题标题】:sql table from set of rows to one row从一组行到一行的sql表
【发布时间】:2013-06-28 19:26:55
【问题描述】:

我的问题很简单:

我一直在尝试将表格的输出从

1 a
1 b     into    1 a b c
1 c

2 d
2 e     into    2 d e f
2 f

该表将始终具有 3 行的集合,这些行将成为一个具有 4 列的表,如上所示。

我尝试循环并卡住了……

编辑:用于 SQL_SERVER

【问题讨论】:

  • 什么关系型数据库?我的 SQL,SQL_SERVER?甲骨文?

标签: sql sql-server set sql-server-group-concat


【解决方案1】:

对于 MY_SQL

SELECT A, group_concat(B SEPARATOR " ") as BResult
FROM TABLE
GROUP BY A
  • 对于 ORACLE,如果 B 的顺序很重要,请查看 List_Agg 或 WM_CONCAT 或 over order by。
  • 对于 SQL SERVER,请查看 XML 路径。

但是,如果您只是想将行转换为列...

如果您的 dbms 支持,您可以使用 cte。 你可以看看支点。如果你的 rdbms 支持的话。

【讨论】:

  • 我正在使用 sql server...我会尝试您的解决方案,看看它是否有效
  • 大小写运算符不会假设像数据或某种类型来定义哪些数据何时到哪一列。没有它就没有办法让它工作。
  • 要使其工作,您必须使用像 Row_Number 这样的伪列并按 A 然后 B 排序,然后以某种方式评估第 1、4、7、10 行等(每次 +3),然后是 2 , 5,8,11(每次+3)然后...如果每个单独的行都不存在类型。
【解决方案2】:

您可以使用FOR XML PATH 构造来模拟MySQL 的GROUP_CONCAT,如下所示:

select 
    ID, 
    stuff((select ' ' + Value 
           from YourTable t2 where t1.ID = t2.ID 
           for xml path('')),
          1,2,'') [Values]
from YourTable t1
group by ID

关于该主题的其他答案:

【讨论】:

    猜你喜欢
    • 2017-11-23
    • 2012-11-04
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多