我正在自学SQL,并且一直在使用W3Schools网站。在他们的网站上,他们有一个虚拟数据库,用于演示不同的东西。你也可以用它来尝试自己。他们的TryIt编辑器可以在https://www.w3schools.com/sql/trysql.asp?filename=trysql_select_distinct
找到在完成他们的例子之后,我一直在发明问题并试图回答它们。但是,我遇到了似乎没有用的东西,我想知道我的代码是错误,W3Schools网站上的错误还是SQL的限制。
当我运行以下代码时,它按预期工作并返回每个客户的订单数量。
SELECT c.CustomerName, COUNT(o.OrderID) AS NumberOfOrders
FROM Customers AS C
LEFT JOIN Orders AS o ON c.CustomerID = o.CustomerID
GROUP BY c.CustomerName
然后我决定尝试扩展查询以使用以下代码提供这些订单的总金额。
SELECT c.CustomerName, COUNT(o.OrderID) AS NumberOfOrders, SUM(od.Quantity * p.price) AS TotalOfOrders
FROM (((Customers AS C
LEFT JOIN Orders AS o ON c.CustomerID = o.CustomerID)
LEFT JOIN OrderDetails AS od ON o.OrderID = od.OrderID)
LEFT JOIN Products AS p ON od.ProductID = p.ProductID)
现在,当我在OrderID上运行代码计数不起作用时。例如,对于客户Ana Trujillo Emparedados y helados(CustomerID 2),它返回2而不是1.这是他们的一个订单包含的项目数。
我错过了一些明显的东西吗?
答案 0 :(得分:1)
首先,在第二个查询中,group by子句丢失了。 您正在执行一个名为“重复计算”的错误。 对于您命名的案例(Trujillo Emparedados y helados),计数是正确的,因为有2个细节与客户相关的唯一订单相关。所以现在你不计算订单,但是你在计算订单细节。 要获得“1”,您需要以这种方式使用“distinct”修复查询:
SELECT c.CustomerName, COUNT(distinct o.OrderID) AS NumberOfOrders,
SUM(od.Quantity * p.price) AS TotalOfOrders
FROM (((Customers AS C
LEFT JOIN Orders AS o ON c.CustomerID = o.CustomerID)
LEFT JOIN OrderDetails AS od ON o.OrderID = od.OrderID)
LEFT JOIN Products AS p ON od.ProductID = p.ProductID)
group by c.CustomerName
答案 1 :(得分:0)
您的查询和结果没有任何问题,
这是因为OrderDetails.ProductID 69和70在相同的orderID(10308)
您可以使用select *
获得完整的结果:
SELECT *
FROM (((Customers AS C
LEFT JOIN Orders AS o ON c.CustomerID = o.CustomerID)
LEFT JOIN OrderDetails AS od ON o.OrderID = od.OrderID)
LEFT JOIN Products AS p ON od.ProductID = p.ProductID)
WHERE c.CustomerID = 2
答案 2 :(得分:0)
在w3school中,您可以使用有限的连接条件 所以使用您的私人服务器:)
答案 3 :(得分:0)
当我将SELECT语句修改为
时似乎工作SELECT c.CustomerName, COUNT (DISTINCT o.OrderID) AS NumberOfOrders, SUM(od.Quantity * p.Price) AS TotalOfOrders
感谢Color Dalnet的建议。
答案 4 :(得分:0)
看一下这句话
SELECT c.CustomerID,c.CustomerName, o.OrderId
FROM (((Customers AS C
LEFT JOIN Orders AS o ON c.CustomerID = o.CustomerID)
LEFT JOIN OrderDetails AS od ON o.OrderID = od.OrderID)
)
这表明您的左连接显示orderId两次。计数运算符计算两次。
您需要计算不同的值
这应该是正确的:
SELECT c.CustomerID,c.CustomerName, COUNT(DISTINCT o.OrderID) AS NumberOfOrders, SUM(od.Quantity * p.price) AS TotalOfOrders
FROM (((Customers AS C
LEFT JOIN Orders AS o ON c.CustomerID = o.CustomerID)
LEFT JOIN OrderDetails AS od ON o.OrderID = od.OrderID)
LEFT JOIN Products AS p ON od.ProductID = p.ProductID)
GROUP by c.CustomerID,c.CustomerName