SQL Mehrere Select-Abfragen in eine Tabelle?!?

ToiToi

Lieutenant
Registriert
Sep. 2007
Beiträge
802
Hallo Leutz,

hab mal wieder ein Problem bei der Erstellung einer Abfrage. Und zwar geht es dabei um Inventur-Tabellen, in der alle Geräte der Firma eingetragen sind.

Dann gibt es unterschiedliche Typen wie z.b. PC, Drucker, Bildschirm etc. und unterschiedliche Stati (Mehrzahl Status?^^) wie Im Einsatz, auf Lager etc.

Nun soll meine Abfrage mir Untereinander per Count die Anzahl der einzelnen Stati anzeigen. Soll dann so aussehen:

PC
Im Einsatz: 10
Auf Lager: 5

Eine Einzelne Abfrage habe ich schon:

SELECT Count( Tabelle1.ID)
FROM Tabelle1
LEFT JOIN Tabelle2 ON Tabelle2.typ_id = Tabelle1.typ_id
WHERE Tabelle2.typ_id = 2

Nun habe ich gelesen, dass man dass per Union machen kann aber wir nutzen leider nur die Version SQL 3 und UNION geht wohl erst ab 4. Jetzt wollt ich fragen ob ihr ne andere Möglichkeit parat habt.

Danke schonmal

edit: es soll dann in Excel übertragen werden,damit ich ein Diagramm draus machen kann und in etwa so aussehen:

Link Excel-Bild
 
Zuletzt bearbeitet:
Hinter der ID verbirgt sich der Gerätetyp ? Vermute ich jetzt mal.

Warum lässt Du dann die Abfrage nicht über alle Gerättypen laufen und gruppierst das Ergebnis nach einem abgefragten Feld (ID) ? ( group by )

Grüsse aus dem Münsterland
Rolf
 
ne ID ist die ID-Nummer, die bei jedem Gerät anders ist. Das mit dem Gerätetyp hab ich oben gar nit drin.Es gibt ne model_id, das die ID für die verschiedenen Gerätetypen.
Hast du vllt. grad ne Abfrage parat...komm damit grad gar nit klar^^
 
ah habs schon.
Super danke...ka wie ich so blöd sein konnte^^

edit:

nächstes Problem: wie mache ich, dass Count mir auch 0 zurückgibt. Es gibt halt Typen, von denen noch keiner auf "Schrott" steht. Deshalb sind dann bei der Abfrage nur 4 statt 5 Zeilen vorhanden, wodurch ich die Struktur für Excel nicht mehr habe. Wär halt top, wenn dann einfach ne Null da steht^^

edit2: hab jetzt die Funktion "with rollup" gefunden aber die geht erst ab SQL 4.1. Gibts ne Alternative für SQL 3?
 
Zuletzt bearbeitet:
kann mir den niemand helfen?
 
Code:
SELECT t2.stati, COUNT(t1.id) FROM stati_tabelle t2 LEFT JOIN typen_tabelle t1 ON t1.typ_id = t2.typ_id GROUP BY t2.id;
Wichtig ist das GROUP BY. Leider hast du keine vollstandigen Strukturen gepostet, so daß man viel raten muss, was wo steht. Um auch 0 zurückzubekommen für einen Status ist die Reihenfolge wichtig, also das die andere Tabelle als die Status-Tabelle im JOIN steht.
 
ja ich mach jetzt feierabend und morgen hab ich frei. Werde am Montag mal die Struktur posten...wär nett wenn du dann nochmal drüber guckst.
 
OK...ich stell jetzt mal die Tabellenstruktur auf...hoffe mir kann dann noch jemand helfen.

Tabelle 1
-----------
ident_id = ID-Nummer des Gerätes
status_id = Status des Gerätes (z.B. im Einsatz)
model_id = verknüpft mit Tabelle 2

Tabelle 2
-----------
model_id = Model des Gerätes (z.B. HP TFT 1740)
typ_id = Typ des Gerätes (z.B. Monitor)

Meine momentane Abfrage:

SELECT Count( Tabelle1.ident_id )
FROM Tabelle1
LEFT JOIN Tabelle2 ON Tabelle1.model_id = Tabelle2.model_id
WHERE Tabelle2.typ_id =2
GROUP BY Tabelle1.status_id

Bei dieser Abfrage habe ich dann 5 Zeilen, in denen die Anzahl der Geräte der einzelnen Stati stehen. Wenn aber nun bei einem Gerätetyp z.B. kein Gerät auf Status 4 steht verschwindet diese Zeile und ich habe nur noch 4 Zeilen.

Mal sehn, was euch so einfällt.
 
Ja klar, weil Du durch die where-Bedingung alle anderen Ergebnisse generell ausschließt und somit nicht zurückgibst bzw. das durch den Left Join zurückgegebene nochmal filterst.

Probier mal
LEFT JOIN Tabelle2 ON Tabelle1.model_id = Tabelle2.model_id AND Tabelle2.typ_id =2
 
ne dass funktioniert nicht...dann gibt er mir total fiktive Werte aus.
Durch die Where-Bedingung sage ich ihm ja, dass er mir nur Geräte des Typs PC anzeigen soll. Und dann eben in den 5 Zeilen wie viele PCs im Einsatz, in Reparatur, Reserviert, Schrott oder auf Lager sind.
Ich glaube es liegt an der GROUP BY-Bedingung, die mir einfach nur die gruppiert, wo auch Werte vorhanden sind:

Bespiel:

Soll:

PCs
Im Einsatz: 10
In Reparatur: 5
Reserviert: 0
Schrott: 1
auf Lager 0

Ist:

Im Einsatz: 10
in Reparatur: 5
Schrott: 1
 
In der ersten Tabelle würde doch ein Gerät das es auf dem Schrott nicht gibt überhaupt nicht auftauchen, oder?
Im Excel wäre es bestimmt kein Problem eine Funktion zu schreiben die an den Stellen wo keine Werte vorhanden sind die entsprechenden Zellen einfügt.
 
Das kann sein.

Hab gerade mal an eigenem Beispiel probiert
sowas funktioniert bei mir inkl. 0

SELECT COUNT( t2.value )
FROM tab1 AS t1
LEFT JOIN tab2 AS t2 ON t2.value = t1.value
GROUP BY t1.value

tab1 bei mir wäre in Deinem Falle evt. tabelle 2, also die mit weniger Datensätzen. Mal testweise Werte tauschen oder umformulieren.
 
Zuletzt bearbeitet:
welches SQL verwendest du. kann es vllt. daran liegen, dass ich SQL 3 verwende.
 
MYSQL 5.
Kann schon sein. Allerdings glaube ich bei einer so einfachen Abfrage eher nicht daran.
Ich denke eher bei Dir ist es ein Wertemissmatch. ;)
Du gruppierst zb. nach status und zählst zum Schluss aber nach ident. Ich glaube das geht SO nicht.
Oder wie gesagt alles falsch herum? Ich verliere glaube langsam den Überblick. ;)

Das beste wäre du lieferst mal nen Beispiel-SQL-Dump beider Tabellen. Dann kann ich den mal direkt probieren.
 
klappt auch nicht...hab jetzt die Anfrage mal für meinen Fall so angepasst:

SELECT COUNT(Tabelle2.typ_id )
FROM Tabelle1
LEFT JOIN Tabelle2 ON Tabelle2.model_id = Tabelle1.model_id
WHERE Tabelle2.typ_id =10
GROUP BY Tabelle1.status_id

edit: also so kommt bei mir das selbe Ergebnis, wie wenn ich meine Abfrage von vorher nutze. So langsam glaube ich, dass es an SQL3 liegt :(
 
Zuletzt bearbeitet:
und umgekehrt oder andere Kombi dann wohl auch nicht?
zb. COUNT(Tabelle1.xxx ) FROM Tabelle2 LEFT JOIN Tabelle1

Das Count kann/wird hier glaube eh nur die verbleibende Anzahl der gruppierten Datensätze zählen, also gruppiert nach status_id -> count = Anzahl DS mit gleicher status_id

Das beste ist, du lässt Dir mal statt count beide Tabellen komplett zurückgeben und schaust nach was zurückgeliefert wurde, mal mit, mal ohne group.
 
ja er zählt ja schon richtig. Wenn ich mir die Tabellen ausgeben lasse stimmt die Anzahl ja. Nur es gibt ja dann keine Geräte mit der Status_id z.b. 5

schreibe ich z.b. sowas:

SELECT Tabelle1.ident_id
FROM Tabelle1
LEFT JOIN Tabelle2 ON Tabelle1.model_id = Tabelle2.model_id
WHERE Tabelle2.typ_id =10
AND Tabelle1.status_id =3

krieg ich die Meldung: MySQL lieferte ein leeres Resultat zurück (d. h. null Zeilen)

Das heißt, bei Count kann er ja auch keinen zählen, der status_id 3 hat und deshalb wird das bei group by einfach ignoriert statt, dass er ne 0 hinschreibt.

Ist doch echt zum verzweifeln. wenn ich ja wenigstens wüsste ob es an mir oder an der sql-version liegt.

edit: ich kann auch zählen wen oder was ich will...es kommt immer das gleiche Ergebnis raus. (zwar eigentlich richtig nur ohne die 0 Zeilen)
 
Zuletzt bearbeitet:
Das heißt, bei Count kann er ja auch keinen zählen, der status_id 3 hat und deshalb wird das bei group by einfach ignoriert statt, dass er ne 0 hinschreibt.

Das ist ja auch klar. Weil das Where status_id =3 pauschal filtert.
Mit Where kommst Du hier schon mal gar nicht weiter.
Das Problem liegt an der SQL-Abfrage, nicht an SQL 3.

Hast du denn schonmal testweise die Tabellen im Left Join getauscht,. wie in meinem Beispiel? Was kommt da raus? Auch null?
 
jo hab die Tabellen schon getauscht und auch schon Right Join etc. probiert.
Er gibt mir jedes mal 2 Zeilen aus, weil es nur Geräte mit Status 1 und 2 gibt. Die anderen Zeilen zeigt er halt nit an. Ich hab kein Plan mehr.

hab auch schon mit mit having count (...) <1 nach group by gemacht. Dann zeigt er keine Zeilen an. wenn ich das having > 1 mache zeigt er mir wieder die beiden Zeilen an.
 
Vielleicht ist einfach auch die grundlegende Tabellenstruktur ungünstig konzipiert.
Was passiert wenn Du nur Tabelle 1 abfragst?

SELECT COUNT(Tabelle1.status_id )
FROM Tabelle1
GROUP BY Tabelle1.status_id

Ich gehe davon aus, dass in Tabelle 1 alle vorhandenen Geräte bzw. deren eindeutige ident_id enthalten sind?

evt auch mit GROUP BY Tabelle1.status_id, Tabelle1.model_id
 
Zuletzt bearbeitet:
Zurück
Oben