【发布时间】:2021-11-03 06:18:31
【问题描述】:
我是一名具备 SQL 基础知识的 SAS 程序员。我正在尝试将 SAS 程序转换为 SQL 脚本,并且在 SQL Server 中将行转换为列时需要帮助。
我尝试了该论坛中提供的一些解决方案(如 PIVOT、多重连接等),但无法实现我所需要的。问题是,ID 的行数可能从 1 到 500(或更多)不等,我需要动态创建这些列。然而,在 SAS 中,我不必担心行数的变化,因为 SAS 会使用预定义的过程/方法(如 Proc Transpose 或数组)自动完成。
这是我正在尝试使用的一些示例数据。
感谢您在这方面的帮助。
ID STARTDT ENDDT
1 1/1/2020 1/3/2020
1 2/25/2020 2/28/2020
1 3/10/2020 3/15/2020
2 1/1/2020 1/3/2020
2 2/25/2020 2/28/2020
2 3/10/2020 3/15/2020
2 3/20/2020 3/20/2020
2 3/25/2020 3/31/2020
3 1/1/2020 1/3/2020
4 2/25/2020 2/28/2020
4 3/10/2020 3/15/2020
所需的输出。
ID STDT1 ENDT1 STDT2 ENDT2 STDT3 ENDT3 STDT4 ENDT4 STDT5 ENDT5 ........... STDT(MAX) ENDT(MAX)
1 1/1/2020 1/3/2020 2/25/2020 2/28/2020 3/10/2020 3/15/2020
2 1/1/2020 1/3/2020 2/25/2020 2/28/2020 3/10/2020 3/15/2020 3/20/2020 3/20/2020 3/25/2020 3/31/2020
3 1/1/2020 1/3/2020
4 2/25/2020 2/28/2020 3/10/2020 3/15/2020
【问题讨论】:
-
请向我们展示您的尝试。
-
CREATE TABLE #TEMPDATES WITH (DISTRIBUTION = HASH(ID)) AS SELECT ID, STARTDT, ENDDATE, ROW_NUMBER() OVER(PARTITION BY ID ORDER BY STARTDT, ENDDATE) AS RNK 从 MYTABLE GO SELECT A .ID, A.STARTDT AS STDT1, A.ENDDATE AS ENDT1, B.STARTDT AS STDT2, B.ENDDATE AS ENDT2 FROM #TEMPDATES A INNER JOIN #TEMPDATES B ON A.ID = B.ID WHERE A.RNK = 1 AND B.RNK = 2;
-
请提供足够的代码,以便其他人更好地理解或重现问题。
标签: sql sql-server tsql azure-sql-database azure-synapse