有人可以帮我解决这个问题吗?
我有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)
有什么想法吗?
答案 0 :(得分:1)
使用交叉连接。这是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
答案 1 :(得分:0)
您希望使用外部联接并让客户成为查询的左侧,然后将订单作为剩余查询的左侧,因为客户是您要分组的订单。
我更喜欢左外连接,因为它们更好地映射到你的实际意思:
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
答案 2 :(得分:0)
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)