2012-01-31 319 views
3

有以下表格:SQL查询与相关表的总和

Clients (ID, LastName) 

Orders (ID, ClientID) 

Payments (ID, OrderID, PaymentDate, Amount) 

我需要一个SQL查询,将返回,都使得在给定日期后支付这个总数至少一定量的客户端LastNames名单。

示例:检索所有在2011年1月1日之后付款的客户,总计至少1,000美元。

我能得到谁取得了自某一特定日期(1/1/2011)这样的支付客户端:

SELECT Clients.LastName 
FROM Clients 
WHERE Clients.ID IN (SELECT Orders.ClientID 
         FROM Orders 
         WHERE Orders.ID IN (SELECT Payments.OrderID 
              FROM Payments 
              WHERE Payments.PaymentDate >= '2011-01-01')) 

我无法弄清楚如何只得到那些营养费添加客户端至少达到给定量。

回答

4

我认为你可以使用这样的事情:

select c.ID, c.LastName 
from Clients c 
join Orders o on o.ClientId=c.Id 
join Payments p on p.OrderId=o.Id 
where p.PaymentDate >= '2011-01-01' 
group by c.ID, c.LastName 
having sum(p.PaymentAmount) > 1000 
+0

这个技巧。非常感谢你!! – 2012-01-31 18:14:31

1

我相信这样的事情应该工作:

Clients.LastName 
FROM Clients 
WHERE Clients.ID IN (SELECT Orders.ClientID 
        FROM Orders 
        WHERE Orders.ID IN (SELECT Payments.OrderID 
             FROM Payments 
             WHERE Payments.PaymentDate >= '2011-01-01' 
             GROUP BY Payments.OrderId 
             HAVING SUM(Payments.Amount) > 1000)) 
+0

我同意Blorgbeard/Oleg:子查询不应该被要求。 – Reinderien 2012-01-31 16:15:14

+0

这将显示客户有一个或多个订单支付至少1000(但这些支付是** **相同​​的订单)。它不会显示3个不同订单已支付500美元的客户。 – 2012-01-31 17:07:24

+0

ypercube是正确的。感谢您的输入。 – 2012-01-31 18:17:33

2
SELECT Clients.ID, Clients.LastName--, SUM(Amount) AS TotalPayments 
FROM Clients 
JOIN Orders ON Clients.ID = Orders.ClientId 
JOIN Payments ON Payments.OrderId = Orders.Id 
WHERE Payments.PaymentDate > '20110101' 
GROUP BY Clients.ID, Clients.LastName 
HAVING SUM(Amount) >= 1000 

如果你想知道一个确切的总和 - 取消对评论部分在查询的第一行

+0

别忘了'group by'! – Blorgbeard 2012-01-31 16:13:01

+0

@Blorgbeard是的,已经注意和纠正,thanx! – 2012-01-31 16:14:53

+1

这与我收到的第一个答案相同。英雄所见略同! – 2012-01-31 18:15:10