Estou achando difícil escrever a consulta para a pergunta acima. Eu escrevi a seguinte consulta, mas ela está retornando todas as linhas
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
Sua condição de filtragem é:
HAVING COUNT(p.SupplierID) > 10
COUNT()
conta o número de não NULL
valores. Presumivelmente, todos os produtos têm um fornecedor e você está usando junções internas. Portanto, todas as linhas correspondentes são contadas. É equivalente a:
HAVING COUNT(*) > 10
E isso conta o número de linhas de pedido de um determinado funcionário.
Você deseja contar fornecedores distintos , não linhas de pedidos. O método mais simples é usar COUNT(DISTINCT)
:
HAVING COUNT(DISTINCT p.SupplierID) > 10
Como você está aprendendo SQL, recomendo que você também entenda esta versão:
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
Isso retorna o mesmo conjunto de resultados (assumindo que SupplierId
nunca NULL
). A subconsulta possui uma linha por funcionário / fornecedor. A consulta externa então conta essas linhas.
Este artigo é coletado da Internet.
Se houver alguma infração, entre em [email protected] Delete.
deixe-me dizer algumas palavras