select
CDN.TwrGrupaPelnaNazwa(TG.TwG_GIDNumer) as 'Grupa Twr'
from cdn.TwrKarty TK
left join CDN.TwrGrupyDom as TGD ON TK.Twr_GIDTyp = TGD.TGD_GIDTyp AND TK.Twr_GIDNumer = TGD.TGD_GIDNumer
left join CDN.TwrGrupy as TG ON TGD.TGD_GrOTyp = TG.TwG_GIDTyp AND TGD.TGD_GrONumer = TG.TwG_GIDNumer
Mam tez potworka do pobierania grupy pierwszego poziomu wraz z tłumaczeniem:
SELECT top 1
TwrGT.TLM_Tekst
FROM CDN.TwrKarty AS TW
JOIN CDN.TwrLinki AS T4 ON T4.TwL_GIDTyp=TW.TwR_GIDTyp AND T4.TwL_GIDNumer=TW.TwR_GIDNumer and T4.TwL_GrONumer <> 0
left join cdn.Tlumaczenia TwrGT on t4.TwL_GrONumer = Twrgt.TLM_Numer and t4.TwL_GrOTyp =twrgt.TLM_Typ and Twrgt.TLM_Jezyk = 951
WHERE TwR_Typ=1 and tw.Twr_GIDNumer = ze.ZaE_TwrNumer
Ale nie mogę stworzyć poprawnego zapytania, którego wynik da mi grupę drugiego i trzeciego poziomu i ich tłumaczenia języku angielskim.
Przykład:
Produkt X ma następującą grupę domyślną
OGRÓD/MEBLE/ZESTAWY MEBLI/ZESTAWY BALKONOWE
Potrzebuje zapytania, które w wyniku dam mi w oddzielnych kolumnach: "OGRÓD", "MEBLE","ZESTAWY MEBLI".
Czy jest ktoś wstanie mi podpowiedzieć jak dokować się do tych poszczególnych poziomów grup?
czyli wywołując ją z gidem ostatniego zagnieżdżenia zwróci wszystkie grupy w górę do korzenia
np:
select * from CDN.PobierzDrzewoGrupTowarowychKuKorzeniowi (5197, -16, NULL, NULL, '\') AS PobierzDrzewoGrupTowarowych_1
wynikiem będzie tabelka z którą można się już 'bawić'
Kod Nazwa GIDNumer GIDTyp GrONumer Poziom Sciezka
Grupa Główna Grupa Główna 0 -16 -1 1
TOWARY TOWARY 2 -16 0 1
PODTOWARY PODTOWARY 5195 -16 2 1
BEGIN
;
WITH T (
GidTyp
,ID
,GrTyp
,GrNazwa
,ParID
,Poziom
)
AS (
SELECT TGD_GIDTyp
,TGD_GIDNumer
,TGD_GrOTyp
,TGD_Kod
,TGD_Gronumer
,0 AS poziom
FROM cdn.twrgrupydom
WHERE TGD_GrONumer = 0
UNION ALL
SELECT TGD_GidTyp
,TGD_GIDNumer
,TGD_GrOTyp
,TGD_Kod
,TGD_Gronumer
,p.poziom + 1 AS poziom
FROM T p
INNER JOIN cdn.TwrGrupyDom c ON c.TGD_GrONumer = p.ID
AND p.GidTyp = - 16
WHERE c.TGD_Gronumer <> 0
)
SELECT *
INTO #tmpTwrGr
FROM T
CREATE UNIQUE CLUSTERED INDEX UIX_2 ON #tmpTwrGr (
GidTyp
,ID
)
SELECT @poziom_max = MAX(poziom)
FROM #tmpTwrGr
SET @poziom = @poziom_max
SET @sql = N''
SET @kolumnyTwr = ''
SET @i = 0
WHILE @poziom >= 0
BEGIN
SET @sql = N'ALTER TABLE #tmpTwrGr ADD Poziom' + CAST(@poziom AS NVARCHAR) + N' nvarchar(40), PoziomID' + CAST(@poziom AS NVARCHAR) + N' nvarchar(40)'
EXEC (@sql)
IF @poziom = @poziom_max
BEGIN
SET @sql = N'UPDATE #tmpTwrGr
SET PoziomID' + CAST(@poziom AS NVARCHAR) + '= ParID '
EXEC (@sql)
SET @sql = N'UPDATE #tmpTwrGr
SET Poziom' + CAST(@poziom AS NVARCHAR) + ' = GrNazwa'
EXEC (@sql)
END
ELSE
BEGIN
SET @sql = N'UPDATE c
SET c.Poziom' + CAST(@poziom AS NVARCHAR) + N' = (
CASE WHEN c.poziom <=' + CAST(@poziom AS NVARCHAR) + N' THEN CAST(c.GrNazwa AS nvarchar)
ELSE CAST(p.GrNazwa AS nvarchar) END)
FROM #tmpTwrGr c
LEFT JOIN #tmpTwrGr p
ON c.PoziomID' + CAST(@poziom + 1 AS NVARCHAR) + '= p.ID and p.GidTyp =-16'
EXEC (@sql)
SET @sql = N'UPDATE c
SET c.PoziomID' + CAST(@poziom AS NVARCHAR) + N' = (
CASE WHEN c.poziom <=' + CAST(@poziom AS NVARCHAR) + N' THEN CAST(c.ParID AS nvarchar)
ELSE CAST(p.ParID AS nvarchar) END)
FROM #tmpTwrGr c
LEFT JOIN #tmpTwrGr p
ON c.PoziomID' + CAST(@poziom + 1 AS NVARCHAR) + '= p.ID and p.GidTyp =-16'
EXEC (@sql)
END
SET @poziom = @poziom - 1
END
SET @kolumnyTwr = ''
SET @i = 0
WHILE (@i <= @poziom_max)
BEGIN
SET @kolumnyTwr = @kolumnyTwr + ',[Produkt - Grupa Poziom ' + LTRIM(@i) + '] = CASE WHEN TWRG.Poziom' + LTRIM(@i) + ' IS NULL THEN ''<nieznany>'' ELSE TWRG.Poziom' + LTRIM(@i) + ' END'
SET @i = @i + 1
END
END
(select TwrGT.TLM_Tekst from(
select top 1 GIDNumer from(
select top 2 * from CDN.PobierzDrzewoGrupTowarowych(Twr_GIDNumer,16,null,null,'\',1)
order by GIDNumer
)d order by GIDNumer desc
)g
left join cdn.Tlumaczenia TwrGT on g.GIDNumer = TwrGT.TLM_Numer and TwrGT.TLM_Typ = '-16' and TwrGt.TLM_Pole =2 and TwrGT.TLM_Jezyk = 951
)as Grupa1,
Zapytanie zwraca tłumaczenie danej grupy.
Da się to lepiej zrobić ?