SQL透视时忽略CreatedDate列但需在查询结果中包含该列
解决SQL透视时包含非透视列的问题
给你两个可行的解决方案,根据你的数据情况选择:
方案一:透视后关联原表获取CreatedDate
先完成透视逻辑,再通过col1关联原表,同时对CreatedDate做聚合(避免同一col1返回多条记录):
SELECT piv.col1, piv.Jan, piv.Feb, piv.Mar, piv.Apr, piv.May, piv.Jun, piv.Jul, piv.Aug, piv.Sep, piv.Oct, piv.Nov, piv.Dec, -- 按需求选聚合方式,比如取该col1对应的最新时间戳 MAX(t.CreatedDate) AS CreatedDate FROM ( SELECT col1, col2, Month FROM @TempTable ) d PIVOT ( MAX(col2) FOR Month IN ([1], [2], [3],[4], [5], [6],[7], [8], [9],[10], [11], [12]) ) piv JOIN @TempTable t ON piv.col1 = t.col1 GROUP BY piv.col1, piv.Jan, piv.Feb, piv.Mar, piv.Apr, piv.May, piv.Jun, piv.Jul, piv.Aug, piv.Sep, piv.Oct, piv.Nov, piv.Dec
方案二:子查询中用窗口函数聚合CreatedDate
如果同一col1对应的CreatedDate是唯一的,或者可以通过窗口函数快速确定唯一值,直接在子查询里处理,避免透视时拆分记录:
SELECT col1, Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec, CreatedDate FROM ( SELECT col1, col2, Month, -- 窗口函数按col1分组,取该组的CreatedDate(这里用MAX,也可以用MIN/FIRST_VALUE) MAX(CreatedDate) OVER (PARTITION BY col1) AS CreatedDate FROM @TempTable ) d PIVOT ( MAX(col2) FOR Month IN ([1], [2], [3],[4], [5], [6],[7], [8], [9],[10], [11], [12]) ) piv GROUP BY col1, Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec, CreatedDate
适用场景说明
- 方案一适合同一
col1下有多个不同CreatedDate,需要明确指定聚合规则(比如取最新、最早)的情况; - 方案二适合同一
col1下CreatedDate唯一,或者不需要复杂聚合的场景,执行效率相对更高。
内容的提问来源于stack exchange,提问作者PRI
相关产品推荐
相关产品推荐

