SQL mit CASE in SELECT mit GROUP BY. Brauchen CASE-Wert, sondern erhalten Zeilenwert

8

so grundlegend gibt es 1 Frage und 1 Problem:

1. Frage - Wenn ich 100 Spalten in einer Tabelle habe (und kein Schlüssel oder Index) und ich will diese Tabelle mit sich selbst verbinden oder abwählen, muss ich wirklich jeden Spaltennamen schreiben?

>

2. Problem - das folgende Beispiel zeigt die 1. Frage und mein aktuelles SQL-Statement-Problem

Beispiel:

%Vor%

Die Geschichte ist: Wenn ich den CASE nicht in eine eigene select-Anweisung setze, muss ich den tatsächlichen rowname in GROUP BY setzen und GROUP BY gruppiert nicht den NULL-Wert aus dem CASE, sondern den tatsächlichen Wert aus der Zeile. Und deshalb müsste ich entweder mit allen Spalten verbinden oder eine Unterauswahl treffen, da es keinen Schlüssel und keinen Index gibt, oder irgendwie eine andere Lösung finden.

DBServer ist DB2.

Nun, um es nur mit Worten und ohne SQL zu beschreiben: Ich habe "Bestellartikel", die in "ZD" und "EK" (1 = ZD, 2 = EK) unterteilt werden können und nach "Verteiler" gruppiert werden können. Auch wenn "Bestellartikel" eine von zwei verschiedenen "Abteilungen" (ZD, EK) haben können, sind die Felder / Zeilen für "ZD" und "EK" immer beide gefüllt. Ich brauche die Gruppierung, um die "Abteilung" zu betrachten, und nur wenn sich die bezeichnete "Abteilung" (ZD oder EK) ändert, möchte ich eine neue Gruppe erstellen.

%Vor%

Dies funktioniert hier in der SELECT und ZD, EK in der GROUP BY. Das einzige Problem war, dass, selbst wenn EK nicht das designierte DEPARTEMENT war, es immer noch eine neue Gruppe eröffnete, wenn es sich änderte, weil er den echten EK-Wert und nicht den NULL aus dem CASE verwendete, wie ich oben bereits erklärt habe.

>     
Khazar 31.07.2013, 14:33
quelle

5 Antworten

6

Und hier ist meine Damen und Herren die Lösung für das Problem:

%Vor%

@ t-clausen.dk: Danke!

@others: ...

    
Khazar 02.08.2013, 09:27
quelle
2

Tatsächlich gibt es einen Wildcard-Gleichheitstest. Ich bin nicht sicher, warum Sie nach Feld1 gruppieren, das scheint in Ihrem Beispiel unmöglich. Ich habe versucht, es in deine Frage einzufügen:

%Vor%

Dies schlägt für Datentypen fehl, die nicht vergleichbar sind

    
t-clausen.dk 31.07.2013 15:57
quelle
1

Nein, es gibt keinen Wildcard-Gleichheitstest. Sie müssten jedes Feld auflisten, das Sie einzeln testen möchten. Wenn Sie nicht jedes einzelne Feld testen möchten, können Sie einen Hack verwenden, indem Sie beispielsweise alle Felder verketten, z. B.

%Vor%

Aber auf alle Fälle listet man alle Felder auf.

    
Marc B 31.07.2013 14:40
quelle
1

Ich könnte dazu neigen, es so etwas zu lösen

%Vor%     
WarrenT 02.08.2013 11:43
quelle
0

Wenn Sie alle Zeilen in TabelleA finden müssen, die in Tabelle B übereinstimmen, wie wäre es mit INTERSECT oder INTERSECT DISTINCT?

%Vor%

Wenn Sie jedoch nur Zeilen von A möchten, in denen die gesamte Zeile den Werten in einer Zeile von B entspricht, warum nimmt dann der Beispielcode Werte von A und andere von B? Wenn die Zeile in allen Spalten übereinstimmt, erscheint das sinnlos. (Vielleicht könnte Ihre Frage etwas ausführlicher erklärt werden?)

    
WarrenT 31.07.2013 16:32
quelle

Tags und Links