SQL技术需求:查询订单的产品数量与总价值(附表结构)
搞定这个订单统计SQL查询!
嘿,我来帮你解决这个需求!要获取每个订单的订单ID、用户名、日期、产品总数量和订单总价值,我们需要把两张表关联起来,再做聚合计算。下面给你两种实用的写法:
通用写法(所有SQL数据库都兼容)
这是最基础也最通用的实现方式,用GROUP BY来分组统计:
SELECT o.ID AS Order_ID, o.UserName, o.date, SUM(pio.Qty_Purchased) AS Number_Of_Products, SUM(pio.TotalPrice) AS Order_Total_Value FROM tbl_Order o JOIN tbl_Products_In_Order pio ON o.ID = pio.Order_ID GROUP BY o.ID, o.UserName, o.date;
写法说明
- 用
JOIN将订单表和订单产品表通过Order_ID关联,确保每个订单的用户信息和对应产品数据匹配 SUM(pio.Qty_Purchased)会把同一订单下所有产品的购买数量求和,得到该订单的产品总数量SUM(pio.TotalPrice)则聚合同一订单下所有产品的总价,得到订单的总价值GROUP BY后需列出所有非聚合字段(订单ID、用户名、日期),这是SQL标准要求,确保分组逻辑正确
进阶写法(支持窗口函数的数据库可用)
如果你使用的是MySQL 8+、PostgreSQL、SQL Server这类支持窗口函数的数据库,可以试试这种写法,适合需要同时查看订单明细和聚合数据的场景:
SELECT DISTINCT o.ID AS Order_ID, o.UserName, o.date, SUM(pio.Qty_Purchased) OVER (PARTITION BY o.ID) AS Number_Of_Products, SUM(pio.TotalPrice) OVER (PARTITION BY o.ID) AS Order_Total_Value FROM tbl_Order o JOIN tbl_Products_In_Order pio ON o.ID = pio.Order_ID;
进阶写法优势
PARTITION BY o.ID表示按订单ID分组计算聚合值,无需单独写GROUP BY子句- 添加
DISTINCT是为了让每个订单只返回一条统计结果,避免每条产品记录重复显示聚合数据 - 如果之后需要查看订单内的具体产品明细,去掉
DISTINCT就能同时获取明细和订单统计信息
最终输出结果
用你提供的测试数据运行上述SQL,会得到如下结果:
| Order_ID | UserName | date | Number_Of_Products | Order_Total_Value |
|---|---|---|---|---|
| 1 | john | 2017年3月30日 | 5 | 8.00 |
| 2 | mike | 2017年3月31日 | 1 | 8.00 |
内容的提问来源于stack exchange,提问作者John AJ




