如何用SQL计算每月订单平均金额?附H2数据库查询示例
嘿,我来帮你实现每月订单平均金额的计算需求~ 根据你提供的表结构和数据,这里有几个实用的SQL方案,适配H2数据库:
方案1:直接从原表计算(高效简洁)
这是最直接的写法,不需要嵌套子查询,直接基于ORDERZ表计算每月的平均订单金额:
SELECT DATE_FORMAT(o.order_date, '%Y-%m') AS order_month, AVG(o.price * o.petrol_qty) AS average_order_amount FROM ORDERZ o LEFT JOIN truck t ON o.truck_id = t.truck_id GROUP BY DATE_FORMAT(o.order_date, '%Y-%m') ORDER BY order_month;
关键部分解释:
DATE_FORMAT(o.order_date, '%Y-%m'):把订单日期转换成YYYY-MM格式的字符串,这样就能精准按「年月」分组AVG(o.price * o.petrol_qty):先计算每笔订单的总金额(单价×加油量),再对当月所有订单取平均值LEFT JOIN truck:保留原查询的关联逻辑,如果你的业务不需要关联卡车表(毕竟计算金额没用到卡车字段),可以直接去掉这一行,查询会更快ORDER BY order_month:让结果按时间顺序排列,方便查看趋势
方案2:按年、月分开分组(便于后续筛选)
如果后续需要单独按年或月统计,可以把年和月拆成单独字段:
SELECT YEAR(o.order_date) AS order_year, MONTH(o.order_date) AS order_month, AVG(o.price * o.petrol_qty) AS average_order_amount FROM ORDERZ o LEFT JOIN truck t ON o.truck_id = t.truck_id GROUP BY YEAR(o.order_date), MONTH(o.order_date) ORDER BY order_year, order_month;
方案3:基于你原有的查询结果计算
如果想复用你之前写的订单详情查询,可以把它作为子查询,在外层统计平均值:
SELECT DATE_FORMAT(order_date, '%Y-%m') AS order_month, AVG(total_Price) AS average_order_amount FROM ( -- 你原有的订单详情查询 SELECT o.order_id, o.order_date, o.petrol_qty, o.price AS price_per_litre, (o.price * o.petrol_qty) AS total_Price, t.truck_code FROM ORDERZ o LEFT JOIN truck t ON o.truck_id = t.truck_id GROUP BY o.order_id ) AS order_details GROUP BY DATE_FORMAT(order_date, '%Y-%m') ORDER BY order_month;
小提示:
H2数据库里DATE_FORMAT和TO_CHAR函数都可以用来格式化日期,比如TO_CHAR(o.order_date, 'YYYY-MM')和DATE_FORMAT效果完全一样,选你习惯的写法就行~
内容的提问来源于stack exchange,提问作者valik
相关产品推荐
相关产品推荐

