Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在sql server中使用pivot或aggreate功能将列转换为多个列_Sql_Sql Server - Fatal编程技术网

在sql server中使用pivot或aggreate功能将列转换为多个列

在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')

我在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')

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;