You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 15:06:04