2014-12-07 49 views
1

我试图弄清楚如何用适当的SQL语句解决这个问题: “向客户至少发出三份订单的城市中的所有客户销售了多少,结果应显示城市名称和这些客户的总订单数量“。如何连接三个表,其中一个表与另外两个表的ID不匹配?

问题是我有三个表可以使用:Order1,Order2和Customers。这些表的结构是这样的:

Order1 has the attributes: Ordernr, CustomerNr. 
Order2 has the attributes: Ordernr, Order quantity. 
Customers has the attributes: CustomerNr, Customer name, City name. 

有了这个代码,我可以加入三个表,以便能够显示订单数量从每个城市每一位客户。但是,如何在至少有三个订单的城市中显示订单数量?

SELECT Customers.CustomerNr, CityName, Order2.OrderQuantity 
FROM Order1 INNER JOIN Order2 
    ON Order1.ordernr = Order2.ordernr JOIN Customers 
    ON Customers.CustomerNr = Order1.CustomerNr 

回答

0

试试这个:

SELECT c.CityName, SUM(o2.OrderQuantity) OrderQuantity 
FROM Order1 o1 
INNER JOIN (SELECT o1.CustomerNr 
      FROM Order1 o1 
      GROUP BY o1.CustomerNr 
      HAVING COUNT(o1.Ordernr) >= 3 
      ) AS a ON o1.CustomerNr = a.CustomerNr 
INNER JOIN Order2 o2 ON o1.Ordernr = o2.Ordernr 
INNER JOIN Customers c ON o1.CustomerNr = c.CustomerNr 
GROUP BY c.CityName 
+0

这似乎是一个更准确的解决方案,谢谢! – eqinna 2014-12-08 17:58:38

0

这个查询将返回城市的列表有至少3个数量级:

select CityName 
    from Customers c 
     join Order1 o1 on c.CustomerNr = o1.CustomerNr 
     join Order2 o2 on o1.OrderNr = o2.OrderNr 
group by c.CityName having Sum(o2.OrderQuantity) > 3 

现在你想从这些城市从客户的所有订单(我从表Order1假设)

select o1.* 
    from Order1 o1 joib Customer c on c.CustomerNr = o.CustomerNr 
where c.CityName in (
    select CityName 
    from Customers c 
     join Order1 o1 on c.CustomerNr = o1.CustomerNr 
     join Order2 o2 on o1.OrderNr = o2.OrderNr 
group by c.CityName having Sum(o2.OrderQuantity) > 3 
) 

希望这会有所帮助

+0

我不遵循“c”,“o1”和“o2”的含义吗? – eqinna 2014-12-07 20:27:29

+0

我的意思是,我只想显示客户至少已完成三笔订单的城市的行,并且我希望向结果(输出视图)中添加一列,名为AS'总数量' )总订单数量,您可以从Order2表中的“Orderquantity”列中获得。换句话说,我希望结果显示在两列中:城市名称(至少有3个订单的客户的城市)以及名为“总量”的列,以列出这些订单的总数量客户已经做出。 – eqinna 2014-12-07 20:55:31

+0

c,o1和o2被称为“别名”。您尚未说明'orderQuantity'的含义。我认为这是指订单数量,但似乎它指的是订购数量。 – alzaimar 2014-12-09 06:28:17

相关问题