SELECT-Statements verschachteln
-
Hallo !
Ich habe gerade vor eine Tabelle mit einem einzigen SQL-Statement sozusagen zu "zerlegen" bzw. den Inhalt zu analysieren.
Meine Tabelle sieht so aus:ArtNr CH-Wert 16637 C 38827 A 34343 D 44883 C 49963 C 63853 H 11263 D 24564 A
Das SQL-Statement soll jetzt die CH-Werte einzeln herauspflücken und auflisten.
Ergebnis:ArtNr A C D H 16637 1 38827 1 34343 1 44883 1 49963 1 63853 1 11263 1 24564 1
Im Gegensatz zu meinem Beispiel kann es aber sehr viele Artikel mit gleicher ArtNr geben (ist kein Primärschlüssel) und die Matrix ist dann nicht nur mit 1en befüllt sondern mit allen möglichen Zahlenwerten.
Derzeit funktioniert das nur mit einzelnen Werten und ich muss für jede Spalte in der Ergebnismatrix eine eigene Abfrage durchführen.
SELECT ArtNr, COUNT(CH-Wert) AS C FROM Table_Info WHERE CH-Wert='C' GROUP BY ArtNr;
Zur besseren Darstellung würde ich zum Schluss die ganze Information gerne in einer Tabelle haben und versuche mich deshalb schon einige Zeit an verschachtelten SELECT-Statements.
Leider bin ich bisher noch nicht sehr weit gekommen und wäre für jede kleine Hilfe dankbar :pEdit: Ich experimentiere derzeit mit UNION, aber damit werden die weiteren Ergebnisse leider unten angehängt und nicht als Spalten dazugefügt
lG
Gawan
-
SELECT ArtNr, ( SELECT count( [CH-Wert] ) FROM tab b WHERE a.ArtNr = b.ArtNr and [CH-Wert] = 'A' ) as A, ( SELECT count( [CH-Wert] ) FROM tab b WHERE a.ArtNr = b.ArtNr and [CH-Wert] = 'B' ) as B, ( SELECT count( [CH-Wert] ) FROM tab b WHERE a.ArtNr = b.ArtNr and [CH-Wert] = 'C' ) as C FROM tab a GROUP BY ArtNr
usw...
edit: verschiedene Aliase für die Tabelle vergessen...aber bei mir funktioniert es, wie es soll. Probier nochmal aus.
-
Hiho Airdamm,
in deinem Beispiel werden mit
SELECT count( [CH-Wert] ) FROM tab WHERE a.ArtNr = b.ArtNr and [CH-Wert] = 'C'
ALLE Vorkommen von C gezählt und JEDER Artikelnummer der gleiche Wert zugeordnet.
Das Ergebnis ist also statt
ArtNr A B C 12345 6 16 81 23456 7 90 45 34567 23 6 61
dieses:
ArtNr A B C 12345 103 103 103 23456 142 142 142 34567 90 90 90
-
siehe edit...
-
Ich bin mir nicht ganz sicher ob ich das verstanden habe, aber woher soll ich die beiden Tabellen "a" und "b" bekommen ?
Ich habe ja nur eine Ausgangstabelle...Ich habe es jetzt so gelöst:
SELECT DISTINCT M.ArtNr, C.CNT, N.CNT FROM table_info M, ( SELECT ArtNr, count( [CH-Code] ) AS CNT FROM table_info WHERE [CH-Code] = 'C' group by ArtNr ) as C, ( SELECT ArtNr, count( [CH-Code] ) AS CNT FROM table_info WHERE [CH-Code] = 'N' group by ArtNr ) as N WHERE M.ArtNr = C.ArtNr;
Wobei jedoch das Problem auftritt dass ich im Ergebnis sehr viele Zeilen mit ArtNr habe, da das DISTINCT auf alle drei Spalten angewendet wird
-
Schau Dir meine Abfrage nochmal an.
Du kannst unterschiedliche Tabellenaliase erstellen, die sich aber auf die gleiche Tabelle beziehen.
Alias a und b verweisen auf die gleiche Tabelle.Für Dich müsste es also so aussehen:
SELECT a.ArtNr, ( SELECT count( [CH-Wert] ) FROM table_info b WHERE a.ArtNr = b.ArtNr and [CH-Wert] = 'A' ) as A, ( SELECT count( [CH-Wert] ) FROM table_info b WHERE a.ArtNr = b.ArtNr and [CH-Wert] = 'B' ) as B, ( SELECT count( [CH-Wert] ) FROM table_info b WHERE a.ArtNr = b.ArtNr and [CH-Wert] = 'C' ) as C FROM table_info a GROUP BY a.ArtNr