SQL带参数化表透视:如何显示CarDescription而非CarID?
解决SQL透视查询中显示CarDescription而非CarID的问题
你的问题出在透视操作的子查询没有包含CarDescription和车辆ID,而且外部查询里的tc别名并没有在当前查询范围内,所以数据库找不到这个标识符。下面给你两种完全匹配需求的可行解决办法:
方法一:在子查询中包含所需字段,直接透视输出
我们可以修改子查询,把Id、CarDescription和ColorId一起查出来,透视操作会自动把非聚合、非透视的字段(也就是Id和CarDescription)作为分组依据,这样最终结果就能直接拿到你要的所有信息:
SELECT Id, CarDescription, [1] as 'Green', [2] as 'Yellow', [3] as 'Red', [1]+[2]+[3] as 'total' FROM ( SELECT tc.Id, tc.CarDescription, tocar.ColorId FROM table_owners_cars tocar LEFT JOIN tid_car tc ON tocar.CarId = tc.Id ) p PIVOT ( COUNT(ColorId) FOR ColorId IN ([1], [2], [3]) ) AS pvt ORDER BY Id;
方法二:透视后关联参数表补全信息
如果不想改动原有子查询的逻辑,也可以先完成透视统计,再通过CarID关联tid_car表,补全车辆ID和名称:
SELECT tc.Id, tc.CarDescription, pvt.[1] as 'Green', pvt.[2] as 'Yellow', pvt.[3] as 'Red', pvt.[1]+pvt.[2]+pvt.[3] as 'total' FROM ( SELECT CarID, ColorId FROM table_owners_cars tocar LEFT JOIN tid_car tc ON tocar.CarId = tc.Id ) p PIVOT ( COUNT(ColorId) FOR ColorId IN ([1], [2], [3]) ) AS pvt LEFT JOIN tid_car tc ON pvt.CarID = tc.Id ORDER BY tc.Id;
最终输出结果
两种方法都能生成你期望的透视表:
--------------------------------------------- Id Car Green Yellow Red Total --------------------------------------------- 1 CarX 3 1 1 5 2 CarY 0 1 0 1 3 CarZ 1 0 0 1 ---------------------------------------------
如果你的颜色列表后续可能变动,还可以用动态SQL实现动态透视,但针对当前固定颜色的需求,上面的静态方案已经足够简洁可靠。
内容的提问来源于stack exchange,提问作者graphene
相关产品推荐
相关产品推荐

