1

Ich habe 2 Tabellen, ein für Ticketcategories sind:Ersten Zählungen von Kindern in einer Beziehung

CAT_PK, CAT_FK, CAT_Name 

Wo CAT_FK Punkte in einer anderen Kategorie in der Tabelle, die als übergeordnete Kategorie wirkt, und null ist, sind die Kategorie hat keine Eltern.

und Tickets:

TIC_PK,CAT_FK 

Wo CAT_FK verweist auf die Kategorie, die Ticket unter fällt. Ein Ticket kann nur eine Kategorie haben.

Die Anzahl der Tickets für jede Kategorie zu ermitteln, ist einfach, aber ich muss eine Anzahl von Tickets für eine Kategorie abrufen, einschließlich aller Tickets, die zu Kindern dieser Kategorie gehören.

Wenn also ein hierchy wie diese vorhanden ist:

Stuff 
>Blue Stuff 
>Red Stuff 
>Yellow Stuff 
    >Yellow Spotted Stuff 

eine Anzahl von Tickets von Stuff bekommen beinhaltet auch Tickets unter allen untergeordneten Kategorien in der Zählung.

Ich habe mit rekursiven CTE ist als Lösung rumgespielt, aber ich bin nicht sicher, ob es wegen der Art der Zählungen und Gruppen, die fähig ist:

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 

Nicht sicher, ob dies überhaupt möglich ist, weil des Fehlers I erhalten,

GROUP BY, Atomen oder Aggregatfunktionen sind nicht in den rekursiven Teil des rekursiven allgemeinen Tabellen Ausdrücke erlaubt

Antwort

1

Sie sollten versuchen, diese:

;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 

See Demo here

+0

Das wirklich nahe ist, was ich versuche zu tun! Problem Ist es nicht inklusive, wenn ich versuche einzuschränken, wonach ich suche. sagen, dass ich eine Zählung der Kategorie will 5, die 1 Kategorie gehören würde, 2 und 3 (alle Kinder der Kategorie 5) Wenn ich ändern WHERE CAT_FK auf NULL: WHERE CAT_FK = 5 Dann bekomme ich eine Zählung jeder Kindkategorie, aber nicht Kategorie 5 ist es selbst – SpeedOfRound

+0

Gern, wenn ich es zu CAT_PK = 5 ändere, es funktioniert stattdessen! Wow, vielen Dank @DhruvJoshi – SpeedOfRound

Verwandte Themen