如何编写SQL查询统计近3个月按客户性别分组的累计总销售额
一、原查询存在的错误
- 关联条件匹配错误:Product表的主键是
SKU ID,并非ProductID,原语句中s.productid = p.productid的关联逻辑完全不匹配表结构,会直接报错 - 带空格字段未转义:表结构中大量字段名带空格(比如
Customer ID、Product ID、Discount Price),别名total sales也带空格,直接书写会触发语法错误,需要根据数据库类型用对应符号转义:SQL Server用[]、MySQL用反引号、PostgreSQL用双引号 - 关联字段名书写错误:Sales表的关联字段是带空格的
Customer ID、Product ID,原语句写的s.customerid、s.productid和表定义的字段名不符,无法识别
二、可优化的逻辑点
- 销售额计算更贴合实际业务:原语句用商品原价
Price计算销售额,表结构中存在Discount Price折后价字段,实际业务中优先用折后价计算实际销售额,结果会更准确,折后价为空时再 fallback 到原价即可 - 可覆盖全性别场景:如果某个性别没有近3个月的订单,
INNER JOIN会直接过滤掉该性别,若需要展示全部性别(无销售额则显示0),可改用LEFT JOIN搭配空值处理函数
三、修正后的参考查询(以SQL Server语法为例)
普通场景(仅展示有订单的性别):
SELECT c.Gender, SUM(s.Quantity * COALESCE(p.[Discount Price], p.Price)) AS [total sales] FROM Customer c INNER JOIN Sales s ON s.[Customer ID] = c.CustomerID INNER JOIN Product p ON s.[Product ID] = p.[SKU ID] WHERE s.[Date] >= DATEADD(MONTH, -3, GETDATE()) GROUP BY c.Gender
全性别展示场景:
SELECT c.Gender, COALESCE(SUM(s.Quantity * COALESCE(p.[Discount Price], p.Price)), 0) AS [total sales] FROM Customer c LEFT JOIN Sales s ON s.[Customer ID] = c.CustomerID AND s.[Date] >= DATEADD(MONTH, -3, GETDATE()) LEFT JOIN Product p ON s.[Product ID] = p.[SKU ID] GROUP BY c.Gender
内容的提问来源于stack exchange,提问作者Thet Paing Htet
相关产品推荐
相关产品推荐

