Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 了解一段关系中的孩子数量_Sql_Sql Server_Tsql_Common Table Expression_Recursive Query - Fatal编程技术网

Sql 了解一段关系中的孩子数量

Sql 了解一段关系中的孩子数量,sql,sql-server,tsql,common-table-expression,recursive-query,Sql,Sql Server,Tsql,Common Table Expression,Recursive Query,我有两张桌子,一张是用于票务分类的: CAT_PK, CAT_FK, CAT_Name TIC_PK,CAT_FK 其中,CAT_FK指向表中充当父类别的另一个类别,如果为空,则该类别没有父类别 和门票: CAT_PK, CAT_FK, CAT_Name TIC_PK,CAT_FK 其中CAT_FK指向票证所属的类别。一张票只能有一个类别 按每个类别获取票数很容易,但我需要做的是获取一个类别的票数,包括属于该类别的子类的所有票数 因此,如果存在这样的等级制度: Stuff >Blu

我有两张桌子,一张是用于票务分类的:

CAT_PK, CAT_FK, CAT_Name
TIC_PK,CAT_FK
其中,
CAT_FK
指向表中充当父类别的另一个类别,如果为空,则该类别没有父类别

门票

CAT_PK, CAT_FK, CAT_Name
TIC_PK,CAT_FK
其中CAT_FK指向票证所属的类别。一张票只能有一个类别

按每个类别获取票数很容易,但我需要做的是获取一个类别的票数,包括属于该类别的子类的所有票数

因此,如果存在这样的等级制度:

Stuff
>Blue Stuff
>Red Stuff
>Yellow Stuff
  >Yellow Spotted Stuff
获得物品票的计数还包括计数中所有子类别下的票

我一直在胡乱使用递归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或AGGRATE函数

你应该试试这个:

;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

这真的很接近我要做的!问题是,当我试图缩小我所寻找的范围时,它并不包含在内。假设我想要一个类别5的计数,其中包括类别1、2和3(类别5的所有子类别),如果我将CAT_FK为NULL的位置更改为:其中CAT_FK=5,那么我会得到每个子类别的计数,但不是类别5,它是selfNevermind,如果我将其更改为CAT_PK=5,它会工作!哇,非常感谢@DhruvJoshi