Grupowanie po zagnieżdżonych kategoriach

0

Witajcie,
mam tabelę z kategoriami, w której jest możliwość zagnieżdżania tychże kategorii. Tzn, że każdy rekord ma pole 'rodzic', w które można wpisać id nadrzędnej kategorii. Kolumna rodzic pełni rolę klucza obcego do tabeli kategorii. Potrzebuję wyszukiwać dane zawierające się w poszczególnych kategoriach.

Powiedzmy, że mam trzy dwie kategorie. A i B. A zawiera się B. Teraz mam dwa rekordy, które są przyporządkowane do tych kategorii. Jeden do A a drugi do B. Czyli wyświetlenie elementów kategorii A powinno wyświetlić dwa rekordy (jeden bezpośrednio do niej przyporządkowany a drugi, pośrednio poprzez rodzica kat. B) a z B jeden.

No i problem polega na tym, że nie potrafię stworzyć zapytania, które uwzględni to zagnieżdżanie. Mam nadzieję, że nakreśliłem sytuację jasno. Dzięki za odpowiedzi

0

potrzebujesz tzw zapytania hierarchicznego - najprostsze będzie wyglądało mniej więcej tak:

SELECT id_child , id_parent FROM my_table CONNECT BY PRIOR id_child= id_parent START WITH id_parent IS NULL;

gdzie:
CONNECT BY PRIOR- powiązanie między elementami hierarchii z kierunkiem wyszukiwania
START WITH - punkt, gdzie zaczynamy - w tym przypadku zaczynamy od roota hierarchii (id_parent IS NULL)

https://docs.oracle.com/cd/B19306_01/server.102/b14200/queries003.htm

jeśli chcesz mieć dostęp do konkretnego poziomu hierarchii, np managerów wyższego szczebla możesz dodać w klauzuli WHERE level:

SELECT id, name FROM my_empl WHERE LEVEL=2 CONNECT BY PRIOR id= id_parent START WITH name = 'boss';
0

No tak. Faktycznie. Takie zapytanie działa. Tzn, jak mam powiedzmy 3 podkategorie to odtwarza strukturę. Ale brakuje mi wyobraźni jak to przełożyć na ten mój problem czyli zliczanie rzeczy z danej kategorii. Musiałbym każdą kategorię potraktować tym zapytaniem hierarchicznym żeby otrzymać wynik ze wszystkimi podkategoriami i sprawdzić czy id_kategorii danej rzeczy jest obecne w tej wynikowej tabeli hierarchii? Dobrze myślę?

Teraz zauważyłem, że nie do końca napisałem czego tak naprawdę potrzebuję. Mam tabelę wydatków przyporządkowanych do poszczególnych kategorii (tych zagnieżdżonych). Potrzebuję otrzymać sumę wszystkich wydatków pogrupowaną względem kategorii. Jeśli kategoria A zawiera się w B i mam dwa wydatki po 100zł w kategorii A i jeden za 100zł w kategorii B to suma dla kategorii dla nadrzędnej kategorii powinna dać wynik 300zł. Niestety przy standardowym zapytaniu grupującym po kategorii z wiadomych względów nie jest uwzgledniana ta hierarchia.

select kat_id, sum(kwota) from wydatki group by kat_i 
  • to ten kod, który nie działa prawidłowo.
0

trzeba by użyć tego kodu z agregacją jako podzapytania i z niego dalej wyjąć potrzebne dane,
tu masz bardzo ładny przykład:

http://dba.stackexchange.com/questions/81313/oracle-hierarchical-query-how-to-follow-max-on-each-level

1 użytkowników online, w tym zalogowanych: 0, gości: 1