SQL中如何复用聚合计算后的别名字段进行后续运算?
SQL中如何复用聚合计算后的别名字段进行后续运算?
嗨,我太懂你这个困扰了!在SQL里,你直接在同一个SELECT子句里用刚定义的聚合别名(比如crop_area_sum、total_gross_sum)去计算其他字段,肯定会报错——这是因为SQL的执行顺序决定的:数据库会先处理FROM/JOIN、WHERE、GROUP BY这些环节,最后才会执行SELECT里的字段计算和别名赋值。所以当你想用别名的时候,数据库还没生成这些别名对应的结果呢!
不过别担心,有两种很实用的方法能解决这个问题,让你不用重复写繁琐的聚合函数:
方法一:使用子查询
先把聚合计算的结果放到一个子查询里,生成包含别名字段的中间数据集,然后在外层查询里直接复用这些别名:
SELECT id, name, crop_area_sum, total_gross_sum, CAST(total_gross_sum * 10 / crop_area_sum AS DECIMAL(16, 2)) AS total_normative FROM ( SELECT r.id, r.name, SUM(p.crop_area) AS crop_area_sum, SUM(p.total_gross) AS total_gross_sum FROM placement p RIGHT JOIN region r ON p.region_id = r.id WHERE r.region_type = 2 AND r.parent_id = 255 GROUP BY r.id ) AS aggregated_data;
方法二:使用CTE(公共表表达式)
CTE的可读性更好,尤其适合复杂查询,同样是先完成聚合计算,再在后续查询里复用别名:
WITH aggregated_data AS ( SELECT r.id, r.name, SUM(p.crop_area) AS crop_area_sum, SUM(p.total_gross) AS total_gross_sum FROM placement p RIGHT JOIN region r ON p.region_id = r.id WHERE r.region_type = 2 AND r.parent_id = 255 GROUP BY r.id ) SELECT id, name, crop_area_sum, total_gross_sum, CAST(total_gross_sum * 10 / crop_area_sum AS DECIMAL(16, 2)) AS total_normative FROM aggregated_data;
这两种方式都是先把聚合运算的结果一次性计算好,生成中间数据集,之后你就可以随意用这些别名来做各种后续计算了,不管有多少类似的列,都不用重复写SUM,代码不仅简洁,维护起来也方便得多!
备注:内容来源于stack exchange,提问作者Hamidullo Ismoilov
相关产品推荐
相关产品推荐

