【问题标题】:SQL Count Not working over multiple tablesSQL 计数不适用于多个表
【发布时间】:2017-11-02 08:56:46
【问题描述】:

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

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

【问题讨论】:

  • 正如我在帖子中所说,它在 W3Schools 网站上,所以不确定底层版本是什么。
  • 你使用的是什么数据库?
  • 它是 W3Schools 上的 Demo 数据库。按照他们的说法,它是“著名的 Northwind 示例数据库(包含在 MS Access 和 MS SQL Server 中)”。
  • 第二个查询也需要一个 GROUP BY。

标签: mysql sql


【解决方案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

【讨论】:

    【解决方案2】:

    您的查询和结果没有问题,

    这是因为 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
    

    【讨论】:

      【解决方案3】:

      在 w3school 中,您可以使用受限加入条件 所以使用你的私人服务器:)

      【讨论】:

        【解决方案4】:

        当我将 SELECT 语句修改为时似乎可以工作

        SELECT c.CustomerName, COUNT (DISTINCT o.OrderID) AS NumberOfOrders, SUM(od.Quantity * p.Price) AS TotalOfOrders
        

        感谢 Color Dalnet 的建议。

        【讨论】:

          【解决方案5】:

          看看这个说法

          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。并且 count 运算符会计算两次。

          您需要计算不同的值

          这应该是正确的:

          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
          

          【讨论】:

            猜你喜欢
            • 2022-11-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-01-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多