Knifflige verjointe Abfrage mit Stringfunktionen LISTAGG und Elliminierung doppelter Einträge

atlantis

Benutzer
Beiträge
16
Nachdem ich bei meiner ersten Anfrage sehr positiv von den Rückmeldungen überrascht wurde jetzt eine neue Denksportnuss...
Ziel: 3 gejointe Tabellen unter Nutzung von LISTAGG.
Problem: Ich möchte in der LISTAGG Liste keinen doppelten Einträge...


Zur besseren Übersicht meien Spielwiese:
Begriffe: TLN =Teilenummer; KAT_NR = Katalog Nummer;

3 Tabellen

TLN_ZU_BEZ

PK TLN BEZEICHNUNG
1 111111111 Hupe
5 222222222 Tank
6 333333333 Licht
7 444444444 Bremse
3 666666666 Bolzen
2 777777777 Schraube
4 888888888 Blinker
8 999999999 Fenster

TLN_ZU_KAT
PK TLN KAT_NR
1 111111111 1
3 111111111 5
2 111111111 2
5 222222222 7
4 222222222 1
6 333333333 5
7 444444444 1
8 444444444 8
12 666666666 9
11 666666666 8
13 777777777 3
9 888888888 4
10 999999999 2

KAT_ZU_MOD
KAT_NR MODELL
1 A
2 A
5 B
7 C
10 C
8 D
9 D
4 D
6 E
3 F

Etappenziel 1 Teilenummer und zugehöriges MODELL anzeigen funktioniert schon mit:
[code:/]
select distinct
TzB.TLN, LISTAGG(KzM.MODELL,', ') WITHIN GROUP (ORDER BY KzM.MODELL) "KATALOGE"
from TLN_ZU_BEZ TzB

LEFT JOIN TLN_ZU_KAT TzK ON TzB.TLN = TzK.TLN
LEFT JOIN KAT_ZU_MOD KzM ON TzK.KAT_NR =KzM.KAT_NR
GROUP BY TzB.TLN

liefert

TLN KATALOGE
111111111 A, A, B
222222222 C, C
333333333 B
444444444 A, D
666666666 D, D
777777777 F
888888888 D
999999999 A

Ab jetzt hänge ich in der Luft:
Wunsch noch Bezeichnung in die Liste aufnehmen:

[Code:]
select distinct
TzB.TLN, TzB.Bezeichnung, LISTAGG(KzM.MODELL,', ') WITHIN GROUP (ORDER BY KzM.MODELL) "KATALOGE"
from TLN_ZU_BEZ TzB
LEFT JOIN TLN_ZU_KAT TzK ON TzB.TLN = TzK.TLN
LEFT JOIN KAT_ZU_MOD KzM ON TzK.KAT_NR =KzM.KAT_NR
GROUP BY TzB.TLN

liefert Fehler: ORA-00979: Kein GROUP BY-Ausdruck
Weiteres und für mich noch deutlich größeres Problem:
Ich möchte in der Ergebnsiliste keine Doppelten Nennungen ( siehe grüne A/C)


Ziel:
TLN KATALOGE


111111111 A, B
222222222 C
333333333 B
444444444 A, D
666666666 D
777777777 F
888888888 D
999999999 A


Hat jemand einen Hinweis, Link, Idee, Code .... ????
 
Zuletzt bearbeitet:
Werbung:
Hi,

um die doppelte Einträge aus Kataloge herauszubekommen, musst du ein Subselect verwenden:
Code:
select listagg (modell...) from (select distinct modell, ..)

Wegen dem GROUP BY: Du musst das Feld in die Group by Klausel aufnehmen.
 
Hallo Drmitri

Erstes Thema (Bezeichnung einfügen) mit Deinem Rat problemlos gelöst:
TzB.TLN, TzB.BEZEICHNUNG, LISTAGG(KzM.MODELL,', ') WITHIN GROUP (ORDER BY KzM.MODELL) "KATALOGE"
from TLN_ZU_BEZ TzB
LEFT JOIN TLN_ZU_KAT TzK ON TzB.TLN = TzK.TLN
LEFT JOIN KAT_ZU_MOD KzM ON TzK.KAT_NR =KzM.KAT_NR
GROUP BY TzB.TLN, TzB.BEZEICHNUNG

Mit dem Rest Deines Hinweises bin ich als Grünling noch etwas überfragt.
Ich habe leider ein generelles Verständnisproblem beim Befehl LISTAGG.
Habe es so probiert aber irgendwie ist mir da ein "from "zuviel an Bord...


select distinct
TzB.TLN,TzB.BEZEICHNUNG, select listagg (KzM.MODELL,', ') from (select distinct KzM.MODELL)
WITHIN GROUP (ORDER BY KzM.MODELL) "KATALOGE"
from TLN_ZU_BEZ TzB

LEFT JOIN TLN_ZU_KAT TzK ON TzB.TLN = TzK.TLN
LEFT JOIN KAT_ZU_MOD KzM ON TzK.KAT_NR =KzM.KAT_NR
GROUP BY TzB.TLN,TzB.BEZEICHNUNG

Danke für einen weiteren kleinen Hinweis, oh großes Oracel...
PS: Wie kann man hier im Forum den Code als Code markieren?

Gruss

Atlantis
 
Code:
select 
a.TLN,a.BEZEICHNUNG,  listagg (a.MODELL,', ') 
WITHIN GROUP (ORDER BY KzM.MODELL) "KATALOGE"
from (
select distinct TzB.TLN,TzB.BEZEICHNUNG,modell 
TLN_ZU_BEZ TzB
LEFT JOIN TLN_ZU_KAT TzK ON TzB.TLN = TzK.TLN
LEFT JOIN KAT_ZU_MOD KzM ON TzK.KAT_NR =KzM.KAT_NR) a
Ohne Garantie auf Korrektheit ;)

PS: Tabellennamen dürfen bis zu 30 Zeichen lang sein - nutze das ruhig aus.
Code kannst mit {code} {/code} formatieren nur [ Klammern anstatt { verwenden.
 
Werbung:
Hey super !!!!
Du hattest zwar noch ein paar kleine Tipfehler drin bzw. ein From und den Group By vergessen,
aber ich habe es mir dann mit viel Try and Error voll zusammen reimen können.
Dabei habe ich jetzt auch verstanden, wie der Construct funktioniert, nachdem anfangs nur mein Subselect funktioniert hatte...
:cool:

Falls das mal jemand nachgoogelt. Die Richtige lauffähige Lösung ist:
Code:
select
a.TLN, a.BEZEICHNUNG,  listagg (a.MODELL,', ') WITHIN GROUP (ORDER BY a.MODELL) "KATALOGE"
from
(select distinct TzB.TLN,TzB.BEZEICHNUNG,KzM.MODELL
  from TLN_ZU_BEZ TzB
  LEFT JOIN TLN_ZU_KAT TzK ON TzB.TLN             = TzK.TLN
  LEFT JOIN KAT_ZU_MOD KzM ON TzK.KAT_NR = KzM.KAT_NR
) a
GROUP BY a.TLN,a.BEZEICHNUNG

Vielen lieben Dank für Deine Hilfe !!!!
Atlantis
 
Zurück
Oben