在sql server中使用pivot或aggreate功能将列转换为多个列
我在sql表中有这样的数据 需要进行如下转换(4列需要更改) 试试这个:在sql server中使用pivot或aggreate功能将列转换为多个列,sql,sql-server,Sql,Sql Server,我在sql表中有这样的数据 需要进行如下转换(4列需要更改) 试试这个: DECLARE @Tab TABLE(String VARCHAR(50)) INSERT INTO @Tab VALUES ('914-3000-0002') INSERT INTO @Tab VALUES ('03/14/2018 13:03:10') INSERT INTO @Tab VALUES ('03/16/2018 13:03:10') INSERT INTO @Tab VALUES ('26074')
DECLARE @Tab TABLE(String VARCHAR(50))
INSERT INTO @Tab VALUES ('914-3000-0002')
INSERT INTO @Tab VALUES ('03/14/2018 13:03:10')
INSERT INTO @Tab VALUES ('03/16/2018 13:03:10')
INSERT INTO @Tab VALUES ('26074')
SELECT MAX(CASE WHEN D.RN=1 THEN D.String END)[task no]
,MAX(CASE WHEN D.RN=2 THEN D.String END) [start date]
,MAX(CASE WHEN D.RN=3 THEN D.String END) [end date]
,MAX(CASE WHEN D.RN=4 THEN D.String END) [id]
FROM(
SELECT *
,ROW_NUMBER() OVER(ORDER BY (SELECT NULL))RN
FROM @Tab
)D
输出:
task no start date end date id
914-3000-0002 03/14/2018 13:03:10 03/16/2018 13:03:10 26074
为了安全地执行此操作,您需要一个列来指定顺序。SQL表表示无序集。因此:
select max(case when seqnum = 1 then string end) as taskno,
max(case when seqnum = 2 then string end) as startdate,
max(case when seqnum = 3 then string end) as enddate,
max(case when seqnum = 4 then string end) as id
from (select t.*, row_number() over (order by ?) as seqnum
from t
) t;
?
用于订购列。在没有排序列的情况下,您可以尝试这样做,代码似乎可以工作,但它可能会在任何时候中断。这将如何推广到4行以上?(1)在问题中以文本形式包含示例数据和所需结果。(2) 标记你正在使用的数据库。row\u number()
可以将值按任何顺序排列。是的@GordonLinoff,我知道。但是在这种情况下,我们没有办法。这个答案是不正确的,因为它假设orderby(selectnull)
将以某种规范的顺序返回结果。这根本不是事实。问题不能按规定解决;需要一列来指定表的顺序。非常感谢团队的回复。很快回复:)
task no start date end date id
914-3000-0002 03/14/2018 13:03:10 03/16/2018 13:03:10 26074
select max(case when seqnum = 1 then string end) as taskno,
max(case when seqnum = 2 then string end) as startdate,
max(case when seqnum = 3 then string end) as enddate,
max(case when seqnum = 4 then string end) as id
from (select t.*, row_number() over (order by ?) as seqnum
from t
) t;