SQL查询需求:计算W3Schools数据库中每个客户的总购买金额
解决客户总购买金额的SQL查询问题
看起来你已经把表关联的逻辑搞对了,问题出在聚合函数和分组字段的搭配上。你提到用了SUM和GROUP BY但得到的是所有产品的总和,应该是分组的字段没选对,或者没明确自己到底想要的是「每个客户每个订单的总金额」还是「每个客户所有订单的总金额」,我分两种情况给你解决方案:
1. 每个客户每个订单的总金额(同一订单内的产品金额求和)
如果要计算每个客户的每一笔订单总共花了多少钱,你需要把CustomerID和OrderID都放到GROUP BY里,同时对Quantity*Price求和:
SELECT c.CustomerID, o.OrderID, SUM(ord.Quantity * p.Price) AS Order_Total FROM Customers c INNER JOIN Orders o ON c.CustomerID = o.CustomerID INNER JOIN OrderDetails ord ON o.OrderID = ord.OrderID INNER JOIN Products p ON ord.ProductID = p.ProductID GROUP BY c.CustomerID, o.OrderID;
这样就能得到每个客户的每一笔订单对应的总金额,而不是单产品的金额。
2. 每个客户的所有订单总金额(所有订单加起来的总和)
如果要直接得到每个客户从一开始到现在的总消费额,只需要按CustomerID分组就行,去掉OrderID的选择和分组:
SELECT c.CustomerID, c.CustomerName, -- 可选,加上客户名更直观 SUM(ord.Quantity * p.Price) AS Customer_Total_Spending FROM Customers c INNER JOIN Orders o ON c.CustomerID = o.CustomerID INNER JOIN OrderDetails ord ON o.OrderID = ord.OrderID INNER JOIN Products p ON ord.ProductID = p.ProductID GROUP BY c.CustomerID, c.CustomerName; -- 注意:如果选了CustomerName,分组里也要加上(W3Schools的环境支持这种写法)
为什么你的尝试没成功?
你之前得到的是所有产品的总和,大概率是没有指定正确的分组字段——比如只写了GROUP BY c.CustomerID但同时还选了o.OrderID和单产品的金额,或者完全没加分组字段(那SUM就会把所有行的金额加起来变成一个总数)。记住:SELECT里的非聚合字段必须出现在GROUP BY里,这样数据库才知道按什么维度去聚合计算。
内容的提问来源于stack exchange,提问作者HackersInside
相关产品推荐
相关产品推荐

