2016-02-05 74 views
0

我有一個包含兩個表的數據庫:CustomersServices只返回多行記錄的SQL查詢

Customer表具有帳戶信息,而Services表具有我公司已執行的每項服務的個人記錄。

Services錶鏈接到Customer表與ID列,其中Customers.ID = Services.CustomerID

我正在嘗試執行一個查詢,該查詢將僅返回客戶名稱和賬號,以便只有那些在指定日期範圍內執行了多項服務的客戶。例如,向我展示我在2015年已執行兩次以上工作的所有客戶。

如何編寫此類查詢以便只返回具有多個服務訪問權限的那些查詢?我可以使用遊標來做到這一點,計算結果等,但似乎必須有一個更有效的方法。

回答

2

只需使用一個JOINGROUP BY像這樣:

SELECT Customers.ID 
FROM Customers 
JOIN Services ON Customer.ID=Services.CustomerID 
--WHERE your Services date check here 
GROUP BY Customers.ID -- you can add more columns from the customers table here and in the select as needed 
HAVING SUM(1)>1 

您可以添加WHERE子句可以過濾Services「日期範圍(之前的GROUP BY)。

+2

不和的'大風扇(1)> 1'雖然..'HAVING COUNT(*)> 1'更有意義 – JamieD77

+0

@ JamieD77,我想這是偏好的問題。我通常使用SUM,因爲它也允許添加像這樣的條件:'SUM(CASE WHEN condition THEN 1 ELSE 0 END)'。最後它在這裏也是這樣。 – Lucero

+0

這是真的!..就像'COUNT(CASE WHEN condition THEN field END)'lol +1 – JamieD77

0

選擇從客戶ÇID其中,計數(SELECT * FROM服務S其中C.id = S.CustomersId)> 1

+0

這不是真正有效的SQL Server查詢 – JamieD77

+0

好吧,用'EXISTS(...)'替換'COUNT(...)> 1',你很好。 ;) – Lucero

0
SELECT Customers.CustomerID 
,Customers.Name 
,Customers.AcoountNumber 
FROM Customers 
JOIN 
(
    select Services.CustomerID, Services.CustomerID as totalServices 
    from Services 
    where Services.date BETWEEN @FROM_DATE AND @TO_DATE 
    group by Services.CustomerID 
    having count(Services.CustomerID) >1 
) AS CustomersMoreThan1 on Customers.CustomerID=CustomersMoreThan1.CustomerID 

此查詢允許您從客戶表中,而無需添加更多的列修改你的GROUP BY。