2013-08-01 79 views
0

我正在撰写一个查询,报告有关某个位置的信息,包括该位置发生的班级总数以及注册的参加者总数这些类。我需要一行结果。选择这些项目的项目计数和所有子项的计数

我正在寻找最有效和/或最可读的方式来执行此查询。

,我已经拿出干净的查询如下:

SELECT Location.Id AS LocationId, 
     --additional columns from location or joined tables... 
     ClassStatistics.TotalClasses, 
     ClassStatistics.TotalRegistrants 
FROM Locations AS Location 
OUTER APPLY 
    (
     SELECT 
      COUNT(*) AS TotalClasses, 
      SUM(TotalRegistrantsInClass) AS TotalRegistrants 
     FROM 
      (
       SELECT 
        Class.Id AS ClassId, 
        COUNT(*) AS TotalRegistrantsInClass 
       FROM 
        Classes AS Class 
        LEFT OUTER JOIN 
         Attendees AS Attendee 
        ON 
         Attendee.ClassId = Class.Id 
       WHERE 
        Class.LocationId= Location.Id 
       GROUP BY 
        Class.Id 
      ) AS AttendeeTotalsByClass 
    ) AS ClassStatistics 
WHERE 
    Location.Id = 1 

是这种在实践中查询可以接受的,或者有我错过了一些魔法使之更有效率?

+0

这个查询真的有效吗?它从这个内部查询中返回两列:columnClassId + TotalRegistrantsInClass:'SELECT Class.Id AS ClassId,COUNT(*)AS TotalRegistrantsInClass FROM',但外部查询引用COUNT(*)AS中的NumberOfRegistrants AS TotalClasses,SUM(NumberOfRegistrants) AS TotalRegistrants'?这是一个错误,它无法解析。 – krokodilko

+0

你说得对,我在外面申请了一个错字。这个例子已经被纠正了。 – StrykerJW

回答

0

您应该直接加入类和参与者表。不需要所有的子查询。

SELECT Location.Id AS LocationId, 
     --additional columns from location or joined tables... 
     COUNT(DISTINCT C.ID) AS TotalClasses, 
     COUNT(A.ID) AS TotalRegistrants 
FROM Locations AS L 
INNER JOIN 
     CLASSES C 
ON  C.LocationId= L.Id  
LEFT OUTER JOIN 
     Attendees A 
ON  A.ClassId = C.Id  
WHERE L.Id = 1 
GROUP BY 
     Location.Id AS LocationId, 
     --additional columns from location or joined tables... 
+0

这有效,它更清洁,它纠正了我没有注意到的原始错误。我发布的原始查询总是在一位与会者中出席没有与会者的课程。之前没有注意到。谢谢! 我想为您的答案投票,但我没有这个声望。喜欢做一个SO新手。 – StrykerJW