Вложенный цикл суммирования, пока внешний ключ не «вымирает» - PullRequest
2 голосов
/ 04 июня 2019

Я дергаю себя за функцию поиска данных, которую пытаюсь написать.По сути, этот запрос предназначен для суммирования количества всех voorwerpnummers в таблице Voorwerp_in_Rubriek, сгруппированных по их rubrieknummer, собранным из Rubriek.
После этого я хочу продолжать циклически проходить по сумме, чтобы добраться до их «родителя верхнего уровня».».Rubriek имеет ссылку на внешний ключ с помощью «hoofdrubriek», это будет легче увидеть, поскольку он является родительским в дереве категорий.
Это также означает, что они могут быть вложенными.Значение NULL в столбце hoofdcategory означает, что это родительский элемент верхнего уровня.Идея этого запроса состоит в том, чтобы СУММАТИВНО подсчитать число voorwerpnummers в Voorwerp_in_rubriek и сложить их вместе, пока они не достигнут своего «верхнего уровня родителя».
Поскольку база данных и тестовые данные довольно большие, я решил не добавлять прямыекод к этому вопросу, но вместо этого ссылка на dbfiddle, так что есть больше структуры.

https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=8068a52da6a29afffe6dc793398f0998

Я получил его в некоторой степени, используя этот запрос:

SELECT  R2.hoofdrubriek ,
        COUNT(Vr.rubrieknummer) AS aantal
FROM    Rubriek R1
        RIGHT OUTER JOIN Rubriek R2 ON R1.rubrieknummer = R2.hoofdrubriek
        INNER JOIN Voorwerp_in_rubriek Vr ON R2.rubrieknummer = Vr.rubrieknummer
WHERE   NOT EXISTS ( SELECT *
                     FROM   Rubriek
                     WHERE  hoofdrubriek = R2.rubrieknummer )
        AND R1.hoofdrubriek IS NOT NULL
GROUP BY Vr.rubrieknummer ,
        R2.hoofdrubriek

Но это не возвращает все предметы и провалы в целом.Я надеюсь, что кто-то может мне помочь.

1 Ответ

0 голосов
/ 04 июня 2019

Если я правильно понял

declare @t table (
rubrieknummer int,
cnt int);

INSERT @t(rubrieknummer, cnt)
SELECT R.rubrieknummer, COUNT(Vr.voorwerpnummer) 
FROM Rubriek R 
INNER JOIN voorwerp_in_rubriek Vr ON R.rubrieknummer = Vr.rubrieknummer 
GROUP BY Vr.rubrieknummer, R.rubrieknummer;

--select * from @t;

with t as(
  select rubrieknummer, cnt
  from @t
  union all
  select r.hoofdrubriek, cnt
  from t
  join Rubriek r on t.rubrieknummer = r.rubrieknummer
)
select rubrieknummer, sum(cnt) cnt  
from t
group by rubrieknummer;

применение к вашей скрипте возвращает данные

rubrieknummer   cnt
<null>  42
100 42
101 26
102 6
103 10
10000   8
10100   4
10101   1
10102   3
10500   4
10501   2
10502   2
15000   18
15100   6
15101   2
15102   2
15103   2
15500   12
15501   4
15502   3
15503   5
20000   6
20001   2
20002   1
20003   1
20004   2
25000   4
25001   1
25002   1
25003   1
25004   1
30001   2
30002   1
30004   3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...