gpt4 book ai didi

mysql - SQL 计数不适用于多个表

转载 作者:行者123 更新时间:2023-11-29 10:32:52 24 4
gpt4 key购买 nike

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

我是否遗漏了一些明显的东西?

最佳答案

首先,在第二个查询中缺少 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

关于mysql - SQL 计数不适用于多个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47071121/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com