在 SQL 服务器中将行旋转到具有自定义列名的列

Pivoting rows to columns with custom column names in SQL Server

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

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      greeting1 greeting2 greeting3 greeting4
------------ --------- --------- --------- ---------
longmessage1     hello        hi       hey      hola

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

仅供参考-我正在使用 SQL 服务器。我想我可以以某种方式使用 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;

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