SQL查询2014年购买饮料类满5次的Top10客户总销售额
需求梳理
需要提取2014年购买「Beverages(饮料)」类别商品次数≥5次的前10名客户数据,返回字段包括sales.customers表客户信息、统计年份、总销售额。
原SQL存在的问题
- 多层重复关联相同表,嵌套层级过深,扫描数据量大,执行效率极低
- 购买次数过滤的
HAVING子句被注释,且放置位置错误 - 多个子查询内部无意义添加
ORDER BY,部分数据库会直接触发语法报错 - 混用
RIGHT JOIN和INNER JOIN,逻辑混乱易产生空值异常 - 购买次数统计逻辑错误:未对订单ID去重,同一订单含多个饮料商品时会重复计数,排序错误使用
SUM(R.CUSTID)无实际业务意义 - 购买次数筛选和销售额计算逻辑完全割裂,易出现数据匹配错误
优化后可直接运行的SQL
WITH beverage_cust_2014 AS ( SELECT o.custid, COUNT(DISTINCT o.orderid) AS purchase_cnt, SUM(od.unitprice * od.qty * (1 - od.discount)) AS gross_sales FROM sales.orders o INNER JOIN sales.orderdetails od ON o.orderid = od.orderid INNER JOIN production.products p ON od.productid = p.productid INNER JOIN production.categories c ON p.categoryid = c.categoryid WHERE c.categoryname = 'Beverages' AND YEAR(o.orderdate) = 2014 GROUP BY o.custid HAVING purchase_cnt >= 5 ORDER BY purchase_cnt DESC LIMIT 10 ) SELECT cust.companyname, 2014 AS year, bc.gross_sales -- 如需返回customers表其他字段,直接在这部分添加即可 FROM beverage_cust_2014 bc INNER JOIN sales.customers cust ON bc.custid = cust.custid;
如果需要统计的是客户2014年全品类总销售额而非仅饮料类销售额,只需要把CTE中
gross_sales的计算逻辑替换为关联全品类订单重新汇总即可。
数据库ER图参考

内容的提问来源于stack exchange,提问作者WAATS
相关产品推荐
相关产品推荐

