Запрос с 2 правильными объединениями и группировкой по не отображает правильные результаты - PullRequest
0 голосов
/ 23 марта 2011

Кто-нибудь может мне помочь с этим запросом?

У меня есть 3 таблицы: заказы, клиенты и продукты.

У меня должен быть список количества заказов для каждого клиента + для каждого продукта. Как это:

Customer A    Product X     4
Customer A    Product Y     0
Customer A    Product Z     0
Customer B    Product X     2
Customer B    Product Y     0
Customer B    Product Z     1
Customer C    Product X     0
Customer C    Product Y     0
Customer C    Product Z     8

Я попробовал запрос, подобный этому:

SELECT c.Name, p.Name, COUNT(o.OrderID)
FROM orders AS o
RIGHT JOIN customers AS c ON c.CustomerID=o.CustomerID
RIGHT JOIN products AS p ON p.ProductID=o.ProductID
GROUP BY c.Name, p.Name

но я не могу заставить его работать!
Он отображает только комбинации, в которых счетчик> 0 (где есть записи в «заказах»). Но только при 1 присоединении он работает, и тогда он правильно отображает записи со счетчиком 0. (В этом примере нет проданных продуктов Y, но я хочу видеть Y в списке комбинаций)

Есть идеи?

Ответы [ 3 ]

1 голос
/ 23 марта 2011

Используйте перекрестное соединение. Это Oracle SQL, поэтому не уверен, что он будет работать для mysql.

select c.Name, p.Name, count(o.orderid)
from customers c cross join products p
left join orders o on c.customerid=o.CustomerID and p.ProductID=o.ProductID
GROUP BY c.Name, p.Name
order by c.name, p.name
0 голосов
/ 23 марта 2011
select c.Name, p.Name, sum(case when o.ProductId is not null then 1 else 0 end)
from customers c,products p
left join orders o on c.CustomerID=o.CustomerID and p.ProductID=o.ProductID
GROUP BY c.Name, p.Name

Если это все еще не работает, вы можете сделать это, что должно быть эквивалентно

select c.Name, p.Name, sum(case when o.ProductId is not null then 1 else 0 end)
from customers c
join products p on 1=1
left join orders o on c.CustomerID=o.CustomerID and p.ProductID=o.ProductID
GROUP BY c.Name, p.Name

(я предполагаю здесь .. как я уже сказал, у меня нет sql под рукой)

0 голосов
/ 23 марта 2011

Вы хотите использовать внешние объединения, и клиенты должны быть левой стороной запроса, а заказы - левой стороной оставшегося запроса, потому что заказы, которые вы хотите сгруппировать.

Я предпочитаю левые внешние соединения, потому что они лучше соответствуют тому, что вы на самом деле имеете в виду:

SELECT c.Name, p.Name, COUNT(o.OrderID)
FROM customers c
  left outer join orders o ON c.CustomerID=o.CustomerID
  left outer join products p ON p.ProductID=o.ProductID
GROUP BY c.Name, p.Name
...