2016-02-05 87 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。