Strona 1 z 1
SQL - drzewo grup towarowych
: 03 paź 2025, 13:41
autor: Kris86
Witam,
Z XL:
Jak wyglądałoby zapytanie SQL po stronie DB.
Chcę uzyskać w formie tekstowej drzewo, tylko grup towarowych z jego poziomami/pod poziomami, bez indeksów towarowych w tych grupach.
Chodzi mi po głowie coś takiego:
Grupa -> Podgrupa1 -> Podgrupa1.1 -> Podgrupa1.2
Grupa -> Podgrupa1 -> Podgrupa1.1 -> Podgrupa1.2 -> Podgrupa1.3
Grupa -> Podgrupa2 -> Podgrupa2.1 -> Podgrupa2.2
Grupa -> Podgrupa2 -> Podgrupa2.1 -> Podgrupa2.1.1
Grupa -> Podgrupa2 -> Podgrupa2.1 -> Podgrupa2.2 -> Podgrupa2.2.1
... itd
w zapisie:
Kod: Zaznacz cały
\\Grupa\Podrupa1\Podgrupa1.1\Podgrupa1.2
\\Grupa\Podrupa1\Podgrupa1.1\Podgrupa1.2\Podgrupa1.3
\\Grupa\Podrupa2\Podgrupa2.1\Podgrupa2.2
... itd
Grupa - to korzeń główny struktury drzewa
Dziękuję za wszelką pomoc.
Re: SQL - drzewo grup towarowych
: 06 paź 2025, 08:59
autor: Misek
Kod: Zaznacz cały
SELECT cdn.TwrGrupaPelnaNazwa (GIDNumer), * FROM [CDN].[PobierzDrzewoGrupTowarowychKuLisciom] (
0
,-16
,-1
,NULL
,'|')
Re: SQL - drzewo grup towarowych
: 28 paź 2025, 09:41
autor: mirek_s
Czy można uzyskać info na temat parametrów funkcji
PobierzDrzewoGrupTowarowychKuLisciom
przypuszczam że
@GIDNumer INT to <ID Grupy nadrzędnej>
, @GIDTyp SMALLINT = - 16 ???
, @GrONumer INT = NULL ???
, @SciezkaTyp TINYINT = NULL ???
, @Separator VARCHAR(3) = '\' to < separator rozdzielający poszczególne poziomy>
Czy można prosić o podpowiedź ?
Re: SQL - drzewo grup towarowych
: 28 paź 2025, 11:33
autor: praiser
@SciezkaTyp i @Separator obecnie nic nie robią, ponieważ funkcja została uproszczona. Parametry funkcji wciąż istnieją, więc trzeba je przekazać, ale nie mają wpływu na wynik.
@GidNumer to numer grupy lub towaru zależy od tego co przekazujesz w @GidTyp, który wskazuje typ obiektu, domyślnie -16 czyli grupa towarowa ale można przekazać 16 czyli typ indeksu towarowego i wtedy dostaniesz grupy w których towar z @Gidnumer się znajduje.
opis funkcji jednak wskazuje jasno, że funkcja nie tworzy drzewa „ku liściom” dla towarów zatem dla typ 16 (towar) nie bardzo się nadaje
@GrONumer (domyślnie NULL) też praktycznie stracił znaczenie po re-faktoryzacji funkcji (zamiana TwrGrupy na TwrLinki) więc nie ma co sobie nim zaprzątać głowy.
czyli drzewo dla grupy począwszy od grupy nr 6 w dół ku liściom wywołasz tak
SELECT cdn.TwrGrupaPelnaNazwa (GIDNumer),
* FROM [CDN].[PobierzDrzewoGrupTowarowychKuLisciom] (
6
,-16
,NULL
,NULL
,NULL)
A np. grupy dla indeksu o numerze 6 - trzeba dołożyć warunek filtrujący żeby zawęzić wynik i odczytać nazwę z GroNumer a nie GidNumer (ale bez budowy drzewa)
SELECT
cdn.TwrGrupaPelnaNazwa(GroNumer),
* FROM [CDN].[PobierzDrzewoGrupTowarowychKuLisciom] (
6
,16
,NULL
,NULL
,NULL)
where GidNumer=6
Re: SQL - drzewo grup towarowych
: 29 paź 2025, 09:33
autor: mirek_s
Dziękuję za odpowiedź. Męczyłem się z tabelą TwrGrupy, a tu teraz to Twrlinki.
Ja mam ten sam towar w kilku grupach i jak ma dzisiaj wyglądać zapytanie, które zwraca całą ścieżkę grup i indeks towarowy.
Czy można jakąś podpowiedź.
Re: SQL - drzewo grup towarowych
: 29 paź 2025, 10:33
autor: praiser
Jeśli chcesz zwrócić indeksy z grupami do których należą to użyj innej funkcji, CDN.BudujTwrLinkiKuKorzeniowi.
Kod: Zaznacz cały
SELECT
towar.Twr_Kod,
towar.Twr_Nazwa,
cdn.TwrGrupaPelnaNazwa(link.GrONumer) AS PelnaNazwaGrupy,
link.GrONumer,
link.Lisc,
link.LiczbaPowtorzen
FROM CDN.TwrKarty towar
OUTER APPLY CDN.BudujTwrLinkiKuKorzeniowi(towar.Twr_GidNumer, 16) link
WHERE towar.Twr_Archiwalny = 0
AND link.Lisc = 1 -- oznacza najniższy poziom przypisania towaru w hierarchii danej gałęzi
Jeśli towar jest w kilku grupach jednocześnie, zwróci osobny wiersz dla każdej grupy.
Jeśli towar jest na kilku poziomach tego samego drzewa, liczba powtórzeń najwyższego poziomu wskaże ilość ścieżek w dół.