使用ANSI SQL将列转置为行

时间:2019-02-01 16:32:11

标签: sql transpose

| id |
+----+
| 1  |
| 2  |
| 4  |
| 5  |
+----+

输出为行

1 2 4 5

无需使用Pivot方法,不需要进行硬编码,例如使用1 = 1时的情况进行检查。动态Sql。功能。

我已经搜索了问题,但在纯sql中找不到任何内容 有办法吗?

4 个答案:

答案 0 :(得分:1)

大多数SQL数据库都支持某种组连接功能。例如,在MySQL中,我们可以使用GROUP_CONCAT

SELECT GROUP_CONCAT(id ORDER BY id SEPARATOR ' ') AS output
FROM yourTable;

ANSI标准可能未定义任何内容,但是SQL Server,Oracle和Postgres等仅可以做一些类似于上述的事情。

答案 1 :(得分:1)

由于某些DBMS没有row_number(),我将使用 corre 子查询并进行有条件的夸张:

SELECT MAX(CASE WHEN Seq = 1 THEN Id END) AS ID1,
       . . . 
       MAX(CASE WHEN Seq = 4 THEN Id END) AS ID4
FROM (SELECT t.*,
             (SELECT COUNT(*) FROM table t1 WHERE t1.id <= t.id) AS Seq
      FROM table t
     ) t;

但是,如果ID不是按顺序方式,则此方法可能会失败,那么您将需要使用指定列顺序的PKIDENTITY列)。

答案 2 :(得分:1)

也许您的数据库支持ANSI SQL:2016 LISTAGG 功能: 该功能可以将一组行中的值转换为定界字符串。

查看语法以及数据库支持和替代方法here

  

Listagg 有序集合函数,它需要within group子句来指定顺序。最小语法为:   LISTAGG(<expression>, <separator>) WITHIN GROUP(ORDER BY …)

答案 3 :(得分:0)

如果知道有四个值,则可以使用条件聚合:

select max(case when seqnum = 1 then id end) as id_1,
       max(case when seqnum = 2 then id end) as id_2,
       max(case when seqnum = 3 then id end) as id_3,
       max(case when seqnum = 4 then id end) as id_4       
from (select t.*, row_number() over (order by id) as seqnum
      from t
     ) t;

我不确定这是否符合您的要求。如果要查找具有可变列数的内容,则需要使用动态SQL。