Datenbanktabelle tKategorien Struktur in Excel aufbauen und Kategoriepfad ausgeben

garm

Aktives Mitglied
25. Juli 2013
76
2
Hallo Zusammen,

ich möchte in einer Exceltabelle die Kategoriestruktur so wie in der Wawi in der Artikeldetails anzeigen lassen also
Kategorie Level 1 > Kategorie Level 2 > Kategorie Level 3 > Kategorie Level 4 > Kategorie Level 5 usw....

Da wir in der Wawi leere Kategorien haben, können wir nicht einfach einen Export der Artikeldaten mit den Kategorien machen, da mir dann die leeren Kategorien fehlen.

Nun habe ich mir die Tabelle dbo.tkategorie genommen, die folgendem Aufbau folgt:
kkategorie - koberkategorie - cinet - caktiv - cdellnet - nsort


Nun habe ich auch alle leeren Kategorien und weiß auch in welche oberkategorie diese hat. Doch weis ich immer noch nicht, welche Kategorie noch darüber liegt usw....also fehlt mir noch der gesamte Pfad.

Ich habe nun über Indexformeln kombiniert mit Vergleich einen Weg gefunden die Pfad aufzubauen, doch erscheint mir das sehr fehlerträchtig, da bei 5000 Kategorien einfach die Übersicht verloren geht.

Deswegen meine Frage:
Kennt jemand eine excel abfrage, die mir auf Datenbasis der dbo.tkategorie Tabelle tatsächlich die Hierarchie in Excel in einer Zelle ausgibt? Das wäre ja mal wirklich ein knaller :)

Müsste ja dann so aussehen:

koberkategorie > koberkategorie >koberkategorie ...... bis kKategorie

Die Namen der Kategorien kann ich mir ja aus der tKategorieSprache ziehen mit suche ersetzen. Wäre klasse wenn das einer hinbekommt, können bestimmt noch mehr User hier gebrauchen!

Viele Grüße :)
 

krueger-mp

Aktives Mitglied
5. April 2015
51
4
Hi,
bin eben auch auf diese Anforderung gestoßen. Hier mein Weg, geht sicher besser, aber tut.

Gruß,

SB

###
SELECT * FROM tkategorieartikel ka
JOIN

(SELECT

(SELECT cName FROM tKategorieSprache ks WHERE ks.kKategorie=k1.kKategorie AND ks.kSprache=1) AS LEVEL1,
(SELECT cName FROM tKategorieSprache ks WHERE ks.kKategorie=k2.kKategorie AND ks.kSprache=1) AS LEVEL2,
(SELECT cName FROM tKategorieSprache ks WHERE ks.kKategorie=k3.kKategorie AND ks.kSprache=1) AS LEVEL3,
(SELECT cName FROM tKategorieSprache ks WHERE ks.kKategorie=k4.kKategorie AND ks.kSprache=1) AS LEVEL4,
(SELECT cName FROM tKategorieSprache ks WHERE ks.kKategorie=k5.kKategorie AND ks.kSprache=1) AS LEVEL5,
(SELECT cName FROM tKategorieSprache ks WHERE ks.kKategorie=k6.kKategorie AND ks.kSprache=1) AS LEVEL6,
(SELECT cName FROM tKategorieSprache ks WHERE ks.kKategorie=k7.kKategorie AND ks.kSprache=1) AS LEVEL7,
(SELECT cName FROM tKategorieSprache ks WHERE ks.kKategorie=k8.kKategorie AND ks.kSprache=1) AS LEVEL8,
(SELECT cName FROM tKategorieSprache ks WHERE ks.kKategorie=k9.kKategorie AND ks.kSprache=1) AS LEVEL9,
(SELECT cName FROM tKategorieSprache ks WHERE ks.kKategorie=k10.kKategorie AND ks.kSprache=1) AS LEVEL10,

k1.kKategorie k1,k2.kKategorie k2,k3.kKategorie k3,k4.kKategorie k4,k5.kKategorie k5,
k1.kKategorie k6,k2.kKategorie k7,k3.kKategorie k8,k4.kKategorie k9,k5.kKategorie k10

FROM tkategorie k1

LEFT JOIN tkategorie k2
ON (k2.kOberKategorie=k1.kKategorie)

LEFT JOIN tkategorie k3
ON (k3.kOberKategorie=k2.kKategorie)

LEFT JOIN tkategorie k4
ON (k4.kOberKategorie=k3.kKategorie)

LEFT JOIN tkategorie k5
ON (k5.kOberKategorie=k4.kKategorie)

LEFT JOIN tkategorie k6
ON (k6.kOberKategorie=k5.kKategorie)

LEFT JOIN tkategorie k7
ON (k7.kOberKategorie=k6.kKategorie)

LEFT JOIN tkategorie k8
ON (k8.kOberKategorie=k7.kKategorie)

LEFT JOIN tkategorie k9
ON (k9.kOberKategorie=k8.kKategorie)

LEFT JOIN tkategorie k10
ON (k10.kOberKategorie=k9.kKategorie)

WHERE k1.kOberKategorie=0

) AS KL

ON ka.kKategorie=COALESCE(KL.k10,KL.k9,KL.k8,KL.k7,KL.k6,KL.k5,KL.k4,KL.k3,KL.k2,KL.k1);
###
 
  • Gefällt mir
Reaktionen: garm

garm

Aktives Mitglied
25. Juli 2013
76
2
huuuu danke dir :) Ist gesichert! Sobald ich nächstes mal vor der Aufgabe stehe versuche ich deinen Ansatz zuerst. Danke dir :)
 

DITH-Shop

Sehr aktives Mitglied
8. Juli 2013
2.653
141
Hi,
bin eben auch auf diese Anforderung gestoßen. Hier mein Weg, geht sicher besser, aber tut.

Gruß,

SB

###
SELECT * FROM tkategorieartikel ka
JOIN

(SELECT

(SELECT cName FROM tKategorieSprache ks WHERE ks.kKategorie=k1.kKategorie AND ks.kSprache=1) AS LEVEL1,
(SELECT cName FROM tKategorieSprache ks WHERE ks.kKategorie=k2.kKategorie AND ks.kSprache=1) AS LEVEL2,
(SELECT cName FROM tKategorieSprache ks WHERE ks.kKategorie=k3.kKategorie AND ks.kSprache=1) AS LEVEL3,
(SELECT cName FROM tKategorieSprache ks WHERE ks.kKategorie=k4.kKategorie AND ks.kSprache=1) AS LEVEL4,
(SELECT cName FROM tKategorieSprache ks WHERE ks.kKategorie=k5.kKategorie AND ks.kSprache=1) AS LEVEL5,
(SELECT cName FROM tKategorieSprache ks WHERE ks.kKategorie=k6.kKategorie AND ks.kSprache=1) AS LEVEL6,
(SELECT cName FROM tKategorieSprache ks WHERE ks.kKategorie=k7.kKategorie AND ks.kSprache=1) AS LEVEL7,
(SELECT cName FROM tKategorieSprache ks WHERE ks.kKategorie=k8.kKategorie AND ks.kSprache=1) AS LEVEL8,
(SELECT cName FROM tKategorieSprache ks WHERE ks.kKategorie=k9.kKategorie AND ks.kSprache=1) AS LEVEL9,
(SELECT cName FROM tKategorieSprache ks WHERE ks.kKategorie=k10.kKategorie AND ks.kSprache=1) AS LEVEL10,

k1.kKategorie k1,k2.kKategorie k2,k3.kKategorie k3,k4.kKategorie k4,k5.kKategorie k5,
k1.kKategorie k6,k2.kKategorie k7,k3.kKategorie k8,k4.kKategorie k9,k5.kKategorie k10

FROM tkategorie k1

LEFT JOIN tkategorie k2
ON (k2.kOberKategorie=k1.kKategorie)

LEFT JOIN tkategorie k3
ON (k3.kOberKategorie=k2.kKategorie)

LEFT JOIN tkategorie k4
ON (k4.kOberKategorie=k3.kKategorie)

LEFT JOIN tkategorie k5
ON (k5.kOberKategorie=k4.kKategorie)

LEFT JOIN tkategorie k6
ON (k6.kOberKategorie=k5.kKategorie)

LEFT JOIN tkategorie k7
ON (k7.kOberKategorie=k6.kKategorie)

LEFT JOIN tkategorie k8
ON (k8.kOberKategorie=k7.kKategorie)

LEFT JOIN tkategorie k9
ON (k9.kOberKategorie=k8.kKategorie)

LEFT JOIN tkategorie k10
ON (k10.kOberKategorie=k9.kKategorie)

WHERE k1.kOberKategorie=0

) AS KL

ON ka.kKategorie=COALESCE(KL.k10,KL.k9,KL.k8,KL.k7,KL.k6,KL.k5,KL.k4,KL.k3,KL.k2,KL.k1);
###

Super, vielen Dank.

Auf dieser Basis habe ich mir eine VIEW erstellt, mit der kann ich mir nun in Queries den Pfad zu einem Artikel komplett ausgeben.
Das brauchte ich dringend für einen automatisierten DB-Export um IDEALO vernünftig anbinden zu können.
(Unicorn2 kommt leider mit meinen Datenmengen nicht klar, daher muss ich nun andere Wege gehen )


Code:
USE [eazybusiness]
GO

/****** Object:  View [dbo].[dith_artikel_kategoriepfad]    Script Date: 17.03.2021 11:29:00 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

ALTER VIEW [dbo].[dith_artikel_kategoriepfad]
AS
SELECT        ka.kArtikel,
                             (SELECT        CASE WHEN LEN(LEVEL5) > 0 THEN CONCAT(Level1, ' > ', LEVEL2, ' > ', LEVEL3, ' > ', LEVEL4, ' > ', LEVEL5) WHEN LEN(LEVEL4) > 0 THEN CONCAT(Level1, ' > ', LEVEL2, ' > ', LEVEL3, ' > ', LEVEL4) 
                                                         WHEN LEN(LEVEL3) > 0 THEN CONCAT(Level1, ' > ', LEVEL2, ' > ', LEVEL3) WHEN LEN(LEVEL2) > 0 THEN CONCAT(Level1, ' > ', LEVEL2) END AS expr1) AS Pfad
FROM            dbo.tkategorieartikel AS ka INNER JOIN
                             (SELECT        (SELECT        cName
                                                          FROM            dbo.tKategorieSprache AS ks
                                                          WHERE        (kKategorie = k1.kKategorie) AND (kSprache = 1)) AS LEVEL1,
                                                             (SELECT        cName
                                                               FROM            dbo.tKategorieSprache AS ks
                                                               WHERE        (kKategorie = k2.kKategorie) AND (kSprache = 1)) AS LEVEL2,
                                                             (SELECT        cName
                                                               FROM            dbo.tKategorieSprache AS ks
                                                               WHERE        (kKategorie = k3.kKategorie) AND (kSprache = 1)) AS LEVEL3,
                                                             (SELECT        cName
                                                               FROM            dbo.tKategorieSprache AS ks
                                                               WHERE        (kKategorie = k4.kKategorie) AND (kSprache = 1)) AS LEVEL4,
                                                             (SELECT        cName
                                                               FROM            dbo.tKategorieSprache AS ks
                                                               WHERE        (kKategorie = k5.kKategorie) AND (kSprache = 1)) AS LEVEL5, k1.kKategorie AS k1, k2.kKategorie AS k2, k3.kKategorie AS k3, k4.kKategorie AS k4, k5.kKategorie AS k5
                               FROM            dbo.tkategorie AS k1 LEFT OUTER JOIN
                                                         dbo.tkategorie AS k2 ON k2.kOberKategorie = k1.kKategorie LEFT OUTER JOIN
                                                         dbo.tkategorie AS k3 ON k3.kOberKategorie = k2.kKategorie LEFT OUTER JOIN
                                                         dbo.tkategorie AS k4 ON k4.kOberKategorie = k3.kKategorie LEFT OUTER JOIN
                                                         dbo.tkategorie AS k5 ON k5.kOberKategorie = k4.kKategorie
                               WHERE        (k1.kOberKategorie = 0)) AS KL ON ka.kKategorie = COALESCE (KL.k5, KL.k4, KL.k3, KL.k2, KL.k1)

GO
 
  • Gefällt mir
Reaktionen: Oddn und krueger-mp