SQL中如何让myDate既参与UNPIVOT又作为结果列输出?
解决方案
使用UNPIVOT实现需求
直接修改原查询,将myDate同时包含在子查询和逆透视的列列表中即可:
select myDate, Code, [Value] from ( select ProdId, ProdName, Category, AgeGroup, IsInternal, myDate from dbo.iAudit ) p unpivot ( Value for Code in (ProdId, ProdName, Category, AgeGroup, IsInternal, myDate) ) as unpvt
说明:
- 子查询中保留
myDate字段,确保逆透视后的每条记录都能关联到原数据行的日期值,作为独立列输出。 - 在
UNPIVOT的IN子句中加入myDate,让该字段也参与逆透视转换,生成一条Code='myDate'、Value为对应日期的记录。 - 最终结果里,每条逆透视记录都会带上原行的
myDate,同时myDate自身也会作为一个Code条目出现在结果集中。
更灵活的替代方案(CROSS APPLY)
如果你的数据可能存在NULL值,或者需要更灵活的扩展,推荐使用CROSS APPLY结合VALUES子句的方式,这种写法不会过滤NULL值:
select i.myDate, ca.Code, ca.Value from dbo.iAudit i cross apply ( values ('ProdId', i.ProdId), ('ProdName', i.ProdName), ('Category', i.Category), ('AgeGroup', i.AgeGroup), ('IsInternal', i.IsInternal), ('myDate', i.myDate) ) ca(Code, Value)
说明:
- 这种写法通过
VALUES子句手动定义需要逆透视的列和对应的别名,逻辑更直观。 - 无论列值是否为NULL,都会生成对应的记录,适合需要完整保留数据的场景。
内容的提问来源于stack exchange,提问作者WindSwept
相关产品推荐
相关产品推荐

