2013-08-01 2 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', но внешний запрос относится к NumberOfRegistrants в' COUNT (*) 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

Это работает, он намного чище, и он исправляет ошибку в оригинале, которую я не заметил. Первоначальный запрос, который я опубликовал, всегда уступал одному участнику для занятий, в которых не было участников. Раньше этого не замечал. Спасибо! Я бы хотел проголосовать за ваш ответ, но у меня нет такой репутации. Должен любить быть новичком. – StrykerJW

Смежные вопросы