将列合并为一个的 SQL 函数

标签 sql sql-server

我需要创建一个 SQL 函数,将 x 列和 y 行组合成 1 列,行以逗号分隔并按字母顺序排序。

例子

1          2           3         4
A          B           C         D
E          F           G         H
I          J           K         L

应该变成

1
A,B,C,D
E,F,G,H
I,J,K,L

我尝试搜索,但找不到任何不包含硬编码列的解决方案。

最佳答案

我不清楚您为什么要避免对列进行硬编码,但这可行 ( based on idea here )。

SELECT SUBSTRING(concatenated, 2, 0 + 0x7FFFFFFF)
FROM   YourTable C
       CROSS APPLY (SELECT ',' + t.c.value('.', 'NVARCHAR(128)')
                    FROM   (SELECT (SELECT C.*
                                    FOR XML RAW, TYPE) AS x)v
                           CROSS APPLY v.x.nodes('row/@*') AS t(c)
                    ORDER  BY t.c.value('.', 'NVARCHAR(128)')
                    FOR XML PATH('')) CA(concatenated) 

SQL Fiddle

也可以跨行连接

SELECT SUBSTRING(concatenated, 2, 0 + 0x7FFFFFFF)
FROM   (SELECT ',' + t.c.value('.', 'NVARCHAR(128)')
        FROM   (SELECT (SELECT *
                        FROM   YourTable
                        FOR XML RAW, TYPE) AS x)v
               CROSS APPLY v.x.nodes('row/@*') AS t(c)
        ORDER  BY t.c.value('.', 'NVARCHAR(128)')
        FOR XML PATH('')) CA(concatenated) 

关于将列合并为一个的 SQL 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32549461/

相关文章:

java - MySQL选择从今年到去年特定月份的所有行

sql - 需要帮助来理解 SQL 查询 (oracle10g)

SQL时间函数

mysql - Visual Studio 2010 负载测试 : MySQL as results repository

sql-server - 带有包含空格的数据库的 JDBC url

每个客户的 SQL 总支出

sql - 从sql中提取字符详细信息的特定位置

mysql - 在MySQL中匹配没有空格和标点符号的字符串

sql - 如何在现有表中创建代理键列?

sql-server - ANSI JOIN 与非 ANSI JOIN 查询的性能是否会有所不同?