これらの4つの簡略化されたテーブルを使用してクエリを作成しようとしています。
組織
(pk)組織ID
組織
名(fk)ParentOrganizationID
人事
(pk)人事
ID(fk)組織ID
名
イベント
(pk)EventID
EventName
EventLog
(pk)PersonnelID
(pk)EventID
TimeOfParticipation
eventIDとorganizationIDをパラメーターとして受け取り、組織の名前、組織と子組織の総数、および組織のイベントの参加者の総数を返すテーブルを返すクエリを作成したいと思います。そしてそれは子供たちです。戻り値の例は次のとおりです。
OrganizationName | TotalNumberInOrganization | TotalParticipatingInEvent
TopOrganization | 200 | 150
SecondTier1 | 150 | 100
Tier1Child | 50 | 50
Tier1Child2 | 50 | 25
SecondTier2 | 25 | 25
最上位の組織は、そのすべての子、SecondTier1とSecondTier2、およびそれ自体の合計です。SecondTier1は、そのすべての子、Teir1ChildとTier1Child2、およびそれ自体の合計です。これにより、すべての子と合計が計算されます。
再帰CTEを使用して1つのエントリだけを返す方法、たとえば上位組織の合計だけを返す方法は知っていますが、すべての組織とその子の合計を取得する方法がわかりません。どんな助けでもいただければ幸いです。
ここで要求されているのは、組織に関する単一の行を返すために使用する手順です。
何らかの理由で、UNIONに「U」を追加すると、ネットワークエラーが発生し、編集できなくなります。
@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