请求修正按年份计算Quantity列占比的SQL语句
问题分析与修正方案
原SQL代码的核心问题有两个:
- 子查询计算的是全表的Qty总和,而非按年份分组的同年份总和,导致百分比计算的基准错误;
- 使用
GROUP BY Model, Year做了聚合操作,丢失了原始表的每条记录信息(如ID、原日期),不符合预期输出的格式要求。
修正后的SQL代码(两种实现方式)
方式1:关联按年份分组的子查询
先计算每个年份的总Qty,再关联回原始表计算百分比:
SELECT t.ID, t.Model, t.Year, t.Qty, ROUND(100.0 * t.Qty / y.YearTotal, 2) AS Percentage FROM tblStore t INNER JOIN (SELECT DATEPART(yy, Year) AS YearNum, SUM(Qty) AS YearTotal FROM tblStore GROUP BY DATEPART(yy, Year)) y ON DATEPART(yy, t.Year) = y.YearNum ORDER BY t.ID;
方式2:使用窗口函数(更简洁)
利用窗口函数SUM() OVER (PARTITION BY ...)直接计算同年份的总Qty,无需额外关联:
SELECT ID, Model, Year, Qty, ROUND(100.0 * Qty / SUM(Qty) OVER (PARTITION BY DATEPART(yy, Year)), 2) AS Percentage FROM tblStore ORDER BY ID;
说明
- 两种方式都会输出与预期一致的结果:每条原始记录保留ID、原日期,且同年份的百分比总和为100%;
- 计算时使用
100.0而非100是为了避免整数除法导致的精度丢失(例如10/29用整数除法会得到0,用浮点数才能得到正确的小数结果)。
内容的提问来源于stack exchange,提问作者User_K47
相关产品推荐
相关产品推荐

