如何按分类展示比率(SQL Server):代码无法按category_id拆分
按category_id分类计算比率的MS SQL解决方案
没问题,我来帮你调整这个SQL,让它能按category_id分类计算2001年与2002年的比率。
原来的写法是单独计算两年的整体平均值再做除法,没法实现按分类拆分。我们可以用条件聚合的方式,在同一个查询里按category_id分组,分别计算对应年份的平均值,最后直接得到每个分类下的比率:
SELECT category_id, -- 计算2001年的avg(items*value) AVG(CASE WHEN YEAR(data) = 2001 THEN items*value END) AS avg_2001, -- 计算2002年的avg(items*value) AVG(CASE WHEN YEAR(data) = 2002 THEN items*value END) AS avg_2002, -- 计算比率,避免除以0或NULL的错误 CASE WHEN AVG(CASE WHEN YEAR(data) = 2002 THEN items*value END) IS NOT NULL AND AVG(CASE WHEN YEAR(data) = 2002 THEN items*value END) <> 0 THEN AVG(CASE WHEN YEAR(data) = 2001 THEN items*value END) / AVG(CASE WHEN YEAR(data) = 2002 THEN items*value END) ELSE NULL -- 可根据需求改为0、-1等标记值 END AS ratio FROM table1 WHERE YEAR(data) IN (2001, 2002) -- 仅筛选目标年份,提升查询效率 GROUP BY category_id;
关键说明:
GROUP BY category_id:确保每个category_id单独计算一组数据,实现分类拆分。- 条件聚合:通过
CASE WHEN配合AVG函数,只对指定年份的items*value计算平均值,避免了多次子查询的冗余。 - 除数校验:加入
CASE判断处理除数为NULL或0的情况,防止查询抛出错误,你可以根据业务需求调整ELSE部分的返回值。
内容的提问来源于stack exchange,提问作者riloth
相关产品推荐
相关产品推荐

