Я пытаюсь написать запрос, используя эти четыре упрощенные таблицы:
Организация
(pk) OrganizationID
OrganizationName
(fk) ParentOrganizationID
Персонал
(pk) PersonnelID
(fk) OrganizationID
Имя
Событие
(pk) EventID
EventName
EventLog
(pk) PersonnelID
(pk) EventID
TimeOfParticipation
Я хочу создать запрос, который принимает идентификатор события и идентификатор организации в качестве параметра и возвращает таблицу, которая возвращает все название организации, общее количество в организации и дочерних организациях, а также общее количество участников события для организации и это дети. Пример возврата может быть:
OrganizationName | TotalNumberInOrganization | TotalParticipatingInEvent
TopOrganization | 200 | 150
SecondTier1 | 150 | 100
Tier1Child | 50 | 50
Tier1Child2 | 50 | 25
SecondTier2 | 25 | 25
Высшая организация — это сумма всех своих дочерних элементов, SecondTier1 и SecondTier2, и самой себя. SecondTier1 — это сумма всех его дочерних элементов, Teir1Child и Tier1Child2, и самого себя. Это будет продолжаться при вычислении всех детей и итогов.
Я знаю, как вернуть только одну запись с помощью рекурсивного CTE, например, только итог для верхней организации, но я не уверен, как получить итоги для всех организаций и их дочерних элементов. Любая помощь будет оценена по достоинству.
В соответствии с просьбой, вот процедура, которую я использую для возврата одной строки об организации.
По какой-то причине, если я добавлю «U» в UNION, это выдает мне сетевую ошибку и не позволяет мне редактировать ее.
@OrganizationID uniqueidentifier
@EventID uniqueidentifier
WITH OrganizationList(OrganizationID) AS
(SELECT Organization.OrganizationID
FROM Organization
WHERE OrganizationID = @OrganizationID
NION ALL
SELECT Organization.OrganizationID
FROM Organization
INNER JOIN OrganizationList ON Organization.ParentOrganizationID = OrganizationList.OrganizationID)
SELECT OrganizationAbbreviation,
(SELECT COUNT(*)
FROM Personnel
WHERE Personnel.OrganizationID IN (SELECT OrganizationID FROM OrganizationList))
AS OrganizationTotal,
(SELECT COUNT(*)
FROM Personnel
INNER JOIN EventLog ON EventLog.PersonnelID = Personnel.PersonnelID
WHERE Personnel.OrganizationID IN (SELECT OrganizationID FROM OrganizationList)
AND EventLog.EventID = @EventID)
AS TotalPresent
FROM Organization
WHERE OrganizationID = @OrganizationID