【问题标题】:Give the names of employees who sell the products of more than 10 suppliers给出销售超过 10 家供应商产品的员工姓名
【发布时间】:2019-08-18 08:44:26
【问题描述】:

我发现很难为上述问题编写查询我已经编写了以下查询,但它返回了所有行

SELECT e.EmployeeID 
FROM employees e 
JOIN orders o ON e.EmployeeID = o.EmployeeID 
JOIN order_details od ON o.OrderID = od.OrderID 
JOIN Products p ON od.ProductID = p.ProductID 
GROUP BY e.EmployeeID 
HAVING COUNT(p.SupplierID) > 10

【问题讨论】:

  • COUNT(DISTINCT p.SupplierID) 避免多次计算同一供应商。

标签: sql northwind


【解决方案1】:

您的过滤条件是:

HAVING COUNT(p.SupplierID) > 10

COUNT() 计算非NULL 值的数量。据推测,所有产品都有一个供应商,而您正在使用内部连接。因此,所有匹配的行都会被计算在内。相当于:

HAVING COUNT(*) > 10

这会计算给定员工的订单行数。

您想计算不同个供应商,而不是订单行。最简单的方法是使用COUNT(DISTINCT)

HAVING COUNT(DISTINCT p.SupplierID) > 10

因为你正在学习SQL,所以建议你也理解这个版本:

SELECT e.EmployeeID
FROM (SELECT e.EmployeeID, p.SupplierID, COUNT(*) as num_ordelines
      FROM employees e JOIN
           orders o
           ON e.EmployeeID = o.EmployeeID JOIN
           order_details od
           ON o.OrderID = od.OrderID JOIN
           Products p
           ON od.ProductID = p.ProductID 
      GROUP BY e.EmployeeID, p.SupplierId
     ) es 
GROUP BY EmployeeID
HAVING COUNT(SupplierID) > 10

这会返回相同的结果集(假设 SupplierId 永远不会是 NULL)。每个员工/供应商的子查询有一行。然后外部查询对这些行进行计数。

【讨论】:

    猜你喜欢
    • 2021-03-04
    • 1970-01-01
    • 2017-10-22
    • 2011-05-06
    • 2021-11-08
    • 2019-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多