获取关系中 children 的计数
Getting counts of children in a relationship
我有 2 个 table,一个用于 Ticketcategories:
CAT_PK, CAT_FK, CAT_Name
其中 CAT_FK
指向 table 中充当 parent 类别的另一个类别,为 null 表示该类别没有 parent。
和门票:
TIC_PK,CAT_FK
其中 CAT_FK 指向工单所属的类别。一张票只能有一个类别。
统计每个类别的票数很容易,但我需要做的是统计一个类别的票数,包括属于该类别 children 的所有票数。
所以如果存在这样的层次结构:
Stuff
>Blue Stuff
>Red Stuff
>Yellow Stuff
>Yellow Spotted Stuff
获取 Stuff 的票数还包括计数中所有 child 类别下的票数。
我一直在研究递归 CTE 作为解决方案,但由于计数和组的性质,我不确定它是否可行:
With
TicketCTE (count,CAT_PK,CAT_FK_Parent, CAT_Description)
as
(
Select Count(*) as count,CAT_PK,CAT_FK_Parent, CAT_Description
from Tickets
JOIN TicketCategories
ON TIC_CAT_FK = CAT_PK
GROUP BY CAT_PK,CAT_FK_Parent,CAT_Description
union all
Select Count(*) as count,TicketCategories.CAT_PK,TicketCategories.CAT_FK_Parent, TicketCategories.CAT_Description
from Tickets
join TicketCategories
on TIC_CAT_FK = TicketCategories.CAT_PK
join TicketCTE
on TicketCategories.CAT_PK = TicketCTE.CAT_PK
GROUP BY TicketCategories.CAT_PK,TicketCategories.CAT_FK_Parent,TicketCategories.CAT_Description
)
Select TicketCTE.*
from TicketCTE
left join TicketCTE MgrCTE
on TicketCTE.CAT_FK_Parent = MgrCTE.CAT_PK
由于出现错误,我不确定这是否可行,
GROUP BY, HAVING, or aggregate functions are not allowed in the recursive part of a recursive common table expression
你应该试试这个:
;WITH categorylevel AS (
SELECT
CAT_PK, CAT_Name,CAT_PK AS TopC
FROM TicketCategories
WHERE CAT_FK IS NULL
UNION ALL
SELECT C.CAT_PK, C.CAT_Name,C2.TopC AS TopC
FROM TicketCategories C
INNER JOIN categorylevel C2 ON C.CAT_FK = C2.CAT_PK
)
SELECT TopC, Count(*) FROM categorylevel JOIN Tickets
ON TIC_CAT_FK = CAT_PK
GROUP BY TopC
我有 2 个 table,一个用于 Ticketcategories:
CAT_PK, CAT_FK, CAT_Name
其中 CAT_FK
指向 table 中充当 parent 类别的另一个类别,为 null 表示该类别没有 parent。
和门票:
TIC_PK,CAT_FK
其中 CAT_FK 指向工单所属的类别。一张票只能有一个类别。
统计每个类别的票数很容易,但我需要做的是统计一个类别的票数,包括属于该类别 children 的所有票数。
所以如果存在这样的层次结构:
Stuff
>Blue Stuff
>Red Stuff
>Yellow Stuff
>Yellow Spotted Stuff
获取 Stuff 的票数还包括计数中所有 child 类别下的票数。
我一直在研究递归 CTE 作为解决方案,但由于计数和组的性质,我不确定它是否可行:
With
TicketCTE (count,CAT_PK,CAT_FK_Parent, CAT_Description)
as
(
Select Count(*) as count,CAT_PK,CAT_FK_Parent, CAT_Description
from Tickets
JOIN TicketCategories
ON TIC_CAT_FK = CAT_PK
GROUP BY CAT_PK,CAT_FK_Parent,CAT_Description
union all
Select Count(*) as count,TicketCategories.CAT_PK,TicketCategories.CAT_FK_Parent, TicketCategories.CAT_Description
from Tickets
join TicketCategories
on TIC_CAT_FK = TicketCategories.CAT_PK
join TicketCTE
on TicketCategories.CAT_PK = TicketCTE.CAT_PK
GROUP BY TicketCategories.CAT_PK,TicketCategories.CAT_FK_Parent,TicketCategories.CAT_Description
)
Select TicketCTE.*
from TicketCTE
left join TicketCTE MgrCTE
on TicketCTE.CAT_FK_Parent = MgrCTE.CAT_PK
由于出现错误,我不确定这是否可行,
GROUP BY, HAVING, or aggregate functions are not allowed in the recursive part of a recursive common table expression
你应该试试这个:
;WITH categorylevel AS (
SELECT
CAT_PK, CAT_Name,CAT_PK AS TopC
FROM TicketCategories
WHERE CAT_FK IS NULL
UNION ALL
SELECT C.CAT_PK, C.CAT_Name,C2.TopC AS TopC
FROM TicketCategories C
INNER JOIN categorylevel C2 ON C.CAT_FK = C2.CAT_PK
)
SELECT TopC, Count(*) FROM categorylevel JOIN Tickets
ON TIC_CAT_FK = CAT_PK
GROUP BY TopC