T-SQL车辆销售报表分组异常:合并同客户同周期重复行
T-SQL 车辆销售报表合并行解决方案
当前查询因按车辆类型分组,导致同一客户同一周期的轿车、卡车数据分为两行显示。要实现同一行展示两类车辆的销售数据,需调整聚合逻辑与分组字段,修改后的查询如下:
SELECT c.Name_Customer AS Customer, FORMAT(v.Sell_Date, 'M/yyyy') AS Period, -- 统计轿车销售数量 SUM(CASE WHEN t.Name_Vehicle_Type = 'Car' THEN 1 ELSE 0 END) AS [Cars quantity], -- 统计轿车销售总价 SUM(CASE WHEN t.Name_Vehicle_Type = 'Car' THEN v.Sell_Price ELSE 0 END) AS [Cars total price], -- 统计卡车销售数量 SUM(CASE WHEN t.Name_Vehicle_Type = 'Truck' THEN 1 ELSE 0 END) AS [Trucks quantity], -- 统计卡车销售总价 SUM(CASE WHEN t.Name_Vehicle_Type = 'Truck' THEN v.Sell_Price ELSE 0 END) AS [Trucks total price] FROM Customer AS c INNER JOIN Vehicle AS v ON c.ID_Customer = v.ID_Customer INNER JOIN Vehicle_Type AS t ON v.ID_Vehicle_Type = t.ID_Vehicle_Type WHERE t.Name_Vehicle_Type IN ('Car', 'Truck') -- 仅筛选轿车和卡车数据 GROUP BY c.Name_Customer, FORMAT(v.Sell_Date, 'M/yyyy'), v.ID_Customer ORDER BY c.Name_Customer, Period
修改说明:
- 调整聚合逻辑:用
SUM(CASE...)替代原查询中嵌套在CASE里的聚合函数,将符合条件的记录分别计数、求和,实现同一分组内不同类型数据的聚合。 - 简化分组字段:移除GROUP BY中的
t.Name_Vehicle_Type,仅按客户、周期分组,确保同一客户同一周期的数据合并为一行。 - 优化表关联语法:使用
INNER JOIN替代旧的逗号分隔表写法,逻辑更清晰易读。 - 替换筛选条件:用
WHERE子句直接筛选车辆类型,替代原HAVING子句,执行效率更高。
内容的提问来源于stack exchange,提问作者Maria Lúcia
相关产品推荐
相关产品推荐

