【问题标题】:SQL Query that returns only records with multiple rows仅返回多行记录的 SQL 查询
【发布时间】:2016-05-15 17:09:20
【问题描述】:

我有一个包含两个表的数据库:CustomersServices

Customer 表包含帐户信息,Services 表包含我公司执行的每项服务的单独记录。

Services 表通过ID 列链接到Customer 表,其中Customers.ID = Services.CustomerID

我正在尝试执行一个查询,该查询将仅返回在指定日期范围内执行了多项服务的客户的客户名称和帐号。例如,向我展示我在 2015 年完成两次以上工作的所有客户。

如何编写这种类型的查询,以便只返回具有多次服务访问的查询?我可以使用游标、计数结果等来做到这一点,但似乎必须有更有效的方法。

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    只需像这样使用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 之前)。

    【讨论】:

    • 虽然不是SUM(1)>1 的忠实粉丝。HAVING COUNT(*) > 1 更有意义
    • @JamieD77,我想这是一个偏好问题。我通常使用 SUM,因为它还允许添加如下条件:SUM(CASE WHEN condition THEN 1 ELSE 0 END)。最后它在这里做同样的事情。
    • 这是真的!.. 就像COUNT(CASE WHEN condition THEN field END)lol +1 一样
    • 最后是一样的,但我不得不说我也更喜欢count(*)。主要是因为乍一看,我认为您使用的是序数位置而不是常量。我花了一两秒钟才意识到这一点。
    【解决方案2】:

    从客户 C 中选择 Id where count(从服务 S 中选择 *,其中 C.id = S.CustomersId )> 1

    【讨论】:

    • 这在 SQL Server 中并不是真正有效的查询
    • 好吧,将COUNT(...)>1 替换为EXISTS(...) 就可以了。 ;)
    【解决方案3】:
    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。

    【讨论】:

      猜你喜欢
      • 2013-03-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多