基于多个group by子句从表中检索记录

时间:2016-10-05 12:06:50

标签: sql sql-server database

我有以下表格:

dbo.Customers

Id | Name | ...

dbo.CaseTypes

Id | CustomerId | ...

dbo.CaseTypeDocuments

Id | CaseTypeId | DocumentId | ...

dbo.Documents

Id | Name | ...

dbo.Questions

Id | DocumentId | ...

文档可以有0个或更多问题。案例类型可以包含0个或更多文档。

我想获取客户列表和属于客户的案例类型数量,至少有两个链接到它的文档,每个文档中至少包含一个问题。

所以最终结果应该是这样的:

Customer    |   CaseTypeCount
Cus1        |       10
Cus2        |       2

我已尝试使用内部联接进行一些查询,这些查询返回错误计数的结果。请建议获得此结果的正确方法。

2 个答案:

答案 0 :(得分:0)

Ajinkya,

我认为你看起来像这样:

SELECT c.Name as 'Customer', COUNT(ct.Id) as 'CaseTypeCount' FROM Customers c 
       JOIN CaseTypes ct ON c.Id = ct.Id
       JOIN CaseTypeDocuments td ON ct.Id = td.Id
            WHERE td.DocumentId IN 
                  (SELECT d.Id FROM Documents d
                          JOIN Questions q ON d.Id = q.DocumentId)
GROUP BY c.Name HAVING COUNT(c.Name) >= 2

也许:

SELECT c.Name as 'Customer', COUNT(ct.Id) as 'CaseTypeCount' FROM Customers c 
       JOIN CaseTypes ct ON c.Id = ct.Id
       JOIN CaseTypeDocuments td ON ct.Id = td.Id
       JOIN Questions q ON d.Id = q.DocumentId)
GROUP BY c.Name HAVING COUNT(td.DocumentId) >= 2

我希望这会有所帮助......

祝你好运!

答案 1 :(得分:0)

这是家庭作业吗?看起来他们想测试您对HAVING子句的理解。 要查找至少包含一个问题的文档,您可以使用内部联接:

select
  d.*
from
  documents d inner join
  questions q on
  d.id = q.documentID

但要找到包含至少两个文档的caseTypes,您不仅需要inner join,还需要使用group by子句限制的HAVINGHAVING子句documentID的聚合函数count,如

select
  c.id,
  count(d.id)
from 
  casetype c inner join
  documents d on
  c.documentid = d.id
group by
  c.id
having
  count(d.id) > 2
相关问题