如何使用T-SQL将现有表转换为这种特定格式?
我正在使用SQL Server 2014。我有一个表如何使用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
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;