2012-01-31 314 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