sql - 在 SQL Server 中将行旋转到具有自定义列名称的列

标签 sql sql-server pivot multiple-columns rows

我在将行旋转为列时遇到一些困难,因为我还想命名列。这是我当前的代码,修改后:

SELECT Message, value
FROM Table1
CROSS APPLY 
(
SELECT value FROM STRING_SPLIT(Message,'"')
WHERE value LIKE '%.%'
)
AS SourceTable

我当前的输出:

Message      value 
------------ -----
longmessage1 hello
longmessage1 hi
longmessage1 hey
longmessage1 hola

为了简短起见,我用上面的 longmessage1 替换了实际的 Message。我想要的输出:

Message      greeting1 greeting2 greeting3 greeting4
------------ --------- --------- --------- ---------
longmessage1     hello        hi       hey      hola

问候语的最大数量是六个,如果消息没有六个,我可以接受问候语 4 和 5 的值,假设问候语 4 和 5 为 NULL。

仅供引用 - 我正在使用 SQL Server。我想我可以以某种方式使用 PIVOT 来做到这一点,但我坚持自定义列名称部分,如果 CROSS APPLY 是正确的想法。如果有人可以提供一些建议,那就太好了。谢谢!

最佳答案

您可以使用row_number()和条件聚合:

SELECT t1.Message, a.*
FROM Table1 t1 CROSS APPLY 
     (SELECT MAX(CASE WHEN seqnum = 1 THEN value END) as greeting1,
             MAX(CASE WHEN seqnum = 2 THEN value END) as greeting2,
             MAX(CASE WHEN seqnum = 3 THEN value END) as greeting3,
             MAX(CASE WHEN seqnum = 4 THEN value END) as greeting4,
             MAX(CASE WHEN seqnum = 5 THEN value END) as greeting5,
             MAX(CASE WHEN seqnum = 6 THEN value END) as greeting6
      FROM (SELECT s.value,
                   ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) as seqnum
            FROM STRING_SPLIT(t1.Message,'"')
            WHERE value LIKE '%.%'
           ) s
     ) s;

注意:实际上,这可能会保留值的顺序。然而,根据文档,这并不能得到保证。

关于sql - 在 SQL Server 中将行旋转到具有自定义列名称的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66120768/

相关文章:

php - CodeIgniter:$this->db->query 中的 LEFT JOIN 返回数据库错误

SQL Server-声明局部变量 : "there is already an object named ' ' in the database"

Python:DataFrame.melt - 如何选择一系列列作为标识符变量?

mysql - 如何使用 MySQL 获取类似结果的数据透视表

用于计算 mtd、ytd 值的 SQL 查询

sql - 如何在sql server中水平旋转表

sql - 为什么这个基于范围的查询这么快

Mysql,获取多列索引中特定行之前的行

PHP MYSQL 函数有效,但在添加额外参数时中断

SQL - WHERE 子句中的派生字段