Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.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
如何使用T-SQL将现有表转换为这种特定格式?_Sql_Sql Server_Tsql - Fatal编程技术网

如何使用T-SQL将现有表转换为这种特定格式?

如何使用T-SQL将现有表转换为这种特定格式?,sql,sql-server,tsql,Sql,Sql Server,Tsql,我正在使用SQL Server 2014。我有一个表T1(摘录如下所示): 我希望使用T-SQL查询获得以下输出: StayID ProfileID Name ArrivalDate StayID2 ArrivalDate2 StayID3 ArrivalDate3 100 200 John 2020-03-15 NULL NULL NULL

我正在使用SQL Server 2014。我有一个表
T1
(摘录如下所示):

我希望使用T-SQL查询获得以下输出:

StayID  ProfileID      Name     ArrivalDate    StayID2    ArrivalDate2    StayID3      ArrivalDate3
100       200          John     2020-03-15      NULL          NULL         NULL             NULL
120       300          Peter    2020-03-10      152       2020-04-25       NULL             NULL
210       400          Allan    2020-05-12      NULL          NULL         NULL             NULL
225       600          Smith    2020-03-28      415       2020-04-15       511           2021-02-20
625       900          Derek    2020-06-14      NULL          NULL         NULL             NULL
这里的逻辑是将与特定的
ProfileID
相关的数据转换为宽格式。
StayID
列始终是唯一的


我一直在研究
pivot
函数,但我不确定这是否是解决此问题的正确途径。任何帮助都将不胜感激。

如果您知道结果集中所需的最大组数,则可以使用条件聚合:

select profileid, name,
       max(case when seqnum = 1 then arrivaldate end) as arrivaldate1,
       max(case when seqnum = 1 then stayid end) as stayid1,
       max(case when seqnum = 2 then arrivaldate end) as arrivaldate2,
       max(case when seqnum = 2 then stayid end) as stayid2,
       max(case when seqnum = 3 then arrivaldate end) as arrivaldate3,
       max(case when seqnum = 3 then stayid end) as stayid3
from (select t.*,
             row_number() over (partition by profileid, name order by arrivaldate) as seqnum
      from t
     ) t
group by profileid, name;

这回答了您在这里提出的问题。如果不知道最大组数,则可以使用“提前计算值”调整查询或使用动态SQL。

Pivot是正确的路径。我建议你继续努力,向我们展示你的努力。Pivot的挑战在于需要事先定义所有列。你认为你需要多少栏?@Nick.McDermaid谢谢。我不确定,但一个好的猜测应该是大约一对3(StayID2、StayID3、StayID4和ArrivalDate相同)。如果我猜错了,可能是一个动态透视图?这里有动态透视图和非动态透视图的示例代码。是否有任何合理的上限,每个配置文件可能有多少个StayID?5.10? 50? 目的何在?如果这是用于报告,请使用报告工具以这种方式渲染。
select profileid, name,
       max(case when seqnum = 1 then arrivaldate end) as arrivaldate1,
       max(case when seqnum = 1 then stayid end) as stayid1,
       max(case when seqnum = 2 then arrivaldate end) as arrivaldate2,
       max(case when seqnum = 2 then stayid end) as stayid2,
       max(case when seqnum = 3 then arrivaldate end) as arrivaldate3,
       max(case when seqnum = 3 then stayid end) as stayid3
from (select t.*,
             row_number() over (partition by profileid, name order by arrivaldate) as seqnum
      from t
     ) t
group by profileid, name;