SQL Count无法处理多个表

时间:2017-11-02 08:56:46

标签: mysql sql

我正在自学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.这是他们的一个订单包含的项目数。

我错过了一些明显的东西吗?

5 个答案:

答案 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