SQL Server透视(Pivot)无法显示数值问题求助
解决SQL Server透视(Pivot)操作数值不显示的问题
我来帮你排查下问题,你遇到的数值不显示的问题主要有两个核心原因:
问题分析
- 字段名不匹配:你原表的列名是
oCode、oDateTime、oValue,但在透视查询里却用了sTag、sDateTime、sValue,这会导致SQL无法正确关联到原表的数据字段,自然拿不到数值。 - Pivot目标列名错误:你期望透视出的列是
A、B、C,但在pivot子句的in列表里写的是[X1], [X2], [X3],这些列名和原表中oCode的实际值不匹配,所以透视后的列没有对应的数据填充。
正确的静态透视代码
针对你的需求,修正后的静态透视查询应该是这样的:
select oDateTime, [A], [B], [C] from ( select oCode, oDateTime, oValue from #condesarsp -- 确保这个临时表的列确实是oCode、oDateTime、oValue ) src pivot ( sum(oValue) for oCode in ([A], [B], [C]) ) piv order by oDateTime;
这里做了两处关键修正:
- 子查询里使用原表真实的列名
oCode、oDateTime、oValue pivot的in列表里指定了和原表oCode值一致的[A], [B], [C]
动态透视代码(适配oCode值不固定的场景)
如果你的oCode可能有更多动态值,不想每次手动修改in列表,可以用动态透视:
DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX); -- 动态获取所有oCode的唯一值,拼接成列名 SELECT @cols = STUFF((SELECT ',' + QUOTENAME(oCode) FROM #condesarsp GROUP BY oCode ORDER BY oCode FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,''); -- 构建动态透视查询 SET @query = 'SELECT oDateTime, ' + @cols + ' from ( select oCode, oDateTime, oValue from #condesarsp ) x pivot ( sum(oValue) for oCode in (' + @cols + ') ) p order by oDateTime'; EXECUTE(@query);
这段代码会自动读取#condesarsp里所有唯一的oCode值,生成对应的透视列,避免手动维护列名的麻烦。
验证注意事项
执行前请确认临时表#condesarsp的结构和数据是否和你描述的一致:
- 列名确实是
oCode、oDateTime、oValue oValue是数值类型(因为用了sum聚合函数,如果是字符串类型需要调整聚合方式)
内容的提问来源于stack exchange,提问作者Haminteu
相关产品推荐
相关产品推荐

