SAS程序转SQL Server:涉及日期的动态行转列实现求助
SQL Server 动态行转列解决方案
针对你需要的多列动态行转列场景,直接使用动态SQL+条件聚合实现即可,无需提前指定列数,代码会自动根据数据中的最大行数生成对应列,适配1~N行的场景:
步骤1:构建测试数据(可替换为你的实际表)
-- 构建示例表,实际使用时替换为你自己的源表即可 CREATE TABLE #temp ( ID INT, STARTDT DATE, ENDDT DATE ) INSERT INTO #temp VALUES (1,'2020-01-01','2020-01-03'), (1,'2020-02-25','2020-02-28'), (1,'2020-03-10','2020-03-15'), (2,'2020-01-01','2020-01-03'), (2,'2020-02-25','2020-02-28'), (2,'2020-03-10','2020-03-15'), (2,'2020-03-20','2020-03-20'), (2,'2020-03-25','2020-03-31'), (3,'2020-01-01','2020-01-03'), (4,'2020-02-25','2020-02-28'), (4,'2020-03-10','2020-03-15')
步骤2:执行动态行转列逻辑
DECLARE @sql NVARCHAR(MAX) -- 先获取最大行数,确定需要生成多少组列 DECLARE @max_rn INT SELECT @max_rn = MAX(cnt) FROM (SELECT COUNT(*) cnt FROM #temp GROUP BY ID) t -- 动态拼接聚合字段部分 ;WITH nums AS ( SELECT 1 rn UNION ALL SELECT rn +1 FROM nums WHERE rn < @max_rn ) SELECT @sql = ISNULL(@sql + N',','') + N'MAX(CASE WHEN rn = ' + CAST(rn AS NVARCHAR(10)) + N' THEN STARTDT END) AS [STDT' + CAST(rn AS NVARCHAR(10)) + N'], ' + N'MAX(CASE WHEN rn = ' + CAST(rn AS NVARCHAR(10)) + N' THEN ENDDT END) AS [ENDT' + CAST(rn AS NVARCHAR(10)) + N']' FROM nums -- 拼接完整SQL语句 SET @sql = N' SELECT ID, ' + @sql + N' FROM ( SELECT *, ROW_NUMBER() OVER(PARTITION BY ID ORDER BY STARTDT) rn FROM #temp ) t GROUP BY ID ORDER BY ID ' -- 执行SQL EXEC sp_executesql @sql
说明
- 列数会自动适配数据中的最大行数,即使单个ID对应500+行也无需手动调整代码
- 排序规则可自行修改
ROW_NUMBER()中的ORDER BY部分,比如按ENDDT排序或者其他字段排序 - 实际使用时将代码中的
#temp替换为你的实际源表名即可 - 若需要保留日期的原字符串格式(比如
1/1/2020),可将STARTDT替换为CONVERT(VARCHAR(10), STARTDT, 101),输出格式和你示例一致
内容的提问来源于stack exchange,提问作者Bhavani Kumar Metla
相关产品推荐
相关产品推荐

