未使用WITH语句计算订单价值平均值:为何代码A失效代码B可行?
问题解答:为何SQL语句A无法运行而语句B可以?
核心原因是SQL的执行顺序限制:同一个SELECT子句中,不能直接引用该子句内定义的列别名来进行计算。
具体分析:
对于代码A:
order_num和total_sales是当前SELECT子句里定义的别名,但SQL的执行流程是:先执行FROM/JOIN关联表,再执行GROUP BY分组,最后才进入SELECT子句处理列定义和别名。当你在同一个SELECT里写order_num / total_sales时,数据库还未完成别名的绑定,会识别不到这两个“列”,从而抛出类似“列不存在”的错误。对于代码B:
它使用了CTE(公共表表达式),先执行customer_sales子查询生成临时结果集,此时order_num和total_sales已经是结果集中实际存在的列。外层的SELECT直接调用这个临时结果集,自然可以用这两个列来计算商,不会有识别问题。
代码A的两种修正写法:
写法1:重复计算逻辑
%%sql SELECT c.country, count(distinct c.customer_id) customer_num, count(i.invoice_id) order_num, ROUND(SUM(i.total),2) total_sales, ROUND(SUM(i.total),2) / count(i.invoice_id) avg_order_value FROM customer c LEFT JOIN invoice i ON c.customer_id = i.customer_id GROUP BY 1 ORDER BY 4 DESC;
写法2:使用子查询替代CTE
%%sql SELECT country, customer_num, order_num, total_sales, total_sales / order_num avg_order_value FROM ( SELECT c.country, count(distinct c.customer_id) customer_num, count(i.invoice_id) order_num, ROUND(SUM(i.total),2) total_sales FROM customer c LEFT JOIN invoice i ON c.customer_id = i.customer_id GROUP BY 1 ) AS sub_query ORDER BY total_sales DESC;
内容的提问来源于stack exchange,提问作者Stephanos
相关产品推荐
相关产品推荐

