在 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;
注意:实际上,这可能会保留值的顺序。然而,这并不能保证——根据文档。
我在将行旋转成列时遇到了一些困难,因为我还想为列命名。这是我当前的代码,已修改:
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;
注意:实际上,这可能会保留值的顺序。然而,这并不能保证——根据文档。