Я пишу запрос, который сообщает о местоположении, включая общее количество классов, происходящих в этом месте, и общее количество участников, которые зарегистрированы для эти классы. Мне нужны результаты в одной строке.Выбор количества элементов и подсчет всех детей для этих предметов
Я ищу наиболее эффективный и/или наиболее читаемый способ выполнения этого запроса.
Чистейший запрос, который я придумал следующий:
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
Является ли этот вид запроса приемлемой на практике, или я пропустил некоторые магию, чтобы сделать его более эффективным?
Действительно ли этот запрос работает? Он возвращает два столбца: columnClassId + TotalRegistrantsInClass из этого внутреннего запроса: 'SELECT Class.Id AS ClassId, COUNT (*) AS TotalRegistrantsInClass FROM', но внешний запрос относится к NumberOfRegistrants в' COUNT (*) AS TotalClasses, SUM (NumberOfRegistrants) AS TotalRegistrants'? Это ошибка, она не может разобрать. – krokodilko
Вы правы, у меня была опечатка во внешнем виде. Это было исправлено в этом примере. – StrykerJW