SQL动态透视多日期列布局问题:GNetPre关联日期列调整
解决SQL动态透视中关联日期列并合并重复行的问题
你的核心问题在于当前的PIVOT逻辑只针对GAgreeID做了透视,但没有将Name_Eff_Date和Name_Term_Date与对应的GroupNetworkPrefix绑定,直接把日期列放在查询末尾导致每个行只能对应一个前缀的日期,最终出现重复行。要实现每个前缀列后紧跟对应日期列的预期布局,我们需要为每个GroupNetworkPrefix生成一组关联的聚合列,再通过动态SQL拼接实现。
解决方案代码
IF OBJECT_ID('tempdb..##TBL_TEMP') IS NOT NULL DROP TABLE ##TBL_TEMP DECLARE @SQLQuery AS NVARCHAR(MAX) DECLARE @PivotColumnBlocks AS NVARCHAR(MAX) -- 为每个GroupNetworkPrefix生成对应的GAgreeID、生效日期、终止日期列定义 SELECT @PivotColumnBlocks = COALESCE(@PivotColumnBlocks + ',', '') + QUOTENAME([GroupNetworkPrefix]) + ' = MAX(CASE WHEN [GroupNetworkPrefix] = ' + QUOTENAME([GroupNetworkPrefix], '''') + ' THEN [GAgreeID] END),' + QUOTENAME([GroupNetworkPrefix] + '_Eff_Date') + ' = MAX(CASE WHEN [GroupNetworkPrefix] = ' + QUOTENAME([GroupNetworkPrefix], '''') + ' THEN [Name_Eff_Date] END),' + QUOTENAME([GroupNetworkPrefix] + '_Term_Date') + ' = MAX(CASE WHEN [GroupNetworkPrefix] = ' + QUOTENAME([GroupNetworkPrefix], '''') + ' THEN [Name_Term_Date] END)' FROM #ALLGroup GROUP BY [GroupNetworkPrefix] -- 构建最终动态SQL,拼接固定列与动态生成的关联列 SET @SQLQuery = N' SELECT GroupID, Name, GovtID, GTermDate, ' + @PivotColumnBlocks + ' INTO ##TBL_TEMP FROM #ALLGroup GROUP BY GroupID, Name, GovtID, GTermDate' -- 可选:查看生成的动态SQL语句,用于调试 -- SELECT @SQLQuery -- 执行动态SQL EXEC sp_executesql @SQLQuery -- 查看最终结果 SELECT * FROM ##TBL_TEMP
代码说明
- 关联列生成:通过
CASE+MAX聚合的方式,为每个GroupNetworkPrefix单独生成对应的GAgreeID、生效日期、终止日期列,确保每个前缀的三个列紧密排列。 - 避免重复行:通过
GROUP BY固定维度列(GroupID、Name、GovtID、GTermDate),确保每个分组仅生成一条记录,彻底解决重复行问题。 - 列名可读性:用
前缀_Eff_Date和前缀_Term_Date命名日期列,既避免了列名重复报错,又能清晰对应到所属的前缀。
预期结果示例
执行后你会得到类似这样的单条记录布局(列名更清晰):
| GroupID | Name | GovtID | GTermDate | AB | AB_Eff_Date | AB_Term_Date | CD | CD_Eff_Date | CD_Term_Date | MM | MM_Eff_Date | MM_Term_Date |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 12345 | James | 13131 | 9999-12-31 | OHMDFP000096 | 2017-10-01 | 9999-12-31 | OHMDFP000096 | 2017-10-01 | 9999-12-31 | OHMAFP000055 | 2019-01-01 | 9999-12-31 |
内容的提问来源于stack exchange,提问作者JB_Data_Analyst_KY
相关产品推荐
相关产品推荐

