MySQL: Kombination von Abfragen - wie?

HarryW

Grünschnabel
Hallo Leute!

Ich hoffe, irgendjemand kann mir bei meinem Problem helfen. Ich versuche gerade, eine Auswertung via PHP & MySQL etwas aufzupeppen, bin da aber an ein Problem gekommen, welches ich anscheinend nicht selbst lösen kann.

Folgendes: ich habe eine Tabelle 'table' - die sieht z.B. so aus:


Nummer | Service | Name
-----------------------
0010 | X | Anton
0015 | Y | Emil
0156 | X |
1520 | Y | Carl
0010 | X | Berta
1520 | Y |
1156 | Y |
0015 | Y |
0012 | X |
0010 | X | Anton
1520 | Y | Carl
1580 | X | Max
0112 | X |
0010 | X |
0156 | X | Anton
0010 | X | Berta
0015 | Y | Emil
1157 | X |
1156 | Y |
0010 | X | Anton


Auf diese Tabelle mache ich normalerweise folgende Abfrage:

SELECT COUNT(Nummer) AS Nr, Nummer, Service FROM table GROUP BY Nummer ORDER BY Nr DESC;

Das ergibt dann folgendes:


Nr | Nummer | Service
---------------------
6 | 0010 | X
3 | 0015 | Y
3 | 1520 | Y
2 | 0156 | X
2 | 1156 | Y
1 | 0012 | X
1 | 1580 | X
1 | 0112 | X
1 | 1157 | X


Jetzt will ich diese Abfrage so erweitern, dass mir z.B. in den Zeilen auch noch angezeigt wird, wie oft Anton innerhalb der Gruppierung vorkommt.

Diese Abfrage ist das Ergebniss zahlreicher Versuche:

SELECT COUNT(Nummer) AS Nr, Nummer, Service, (SELECT COUNT(Name) AS Name FROM table WHERE Name LIKE 'Anton') FROM table GROUP BY Nummer ORDER BY Nr DESC;

Das ergibt folgendes:


Nr | Nummer | Service | SELECT COUNT(Name) AS Name FROM table WHERE Name LIKE 'Anton'
-------------------------------------------------------------------------------------
6 | 0010 | X | 3
3 | 0015 | Y | 3
3 | 1520 | Y | 3
2 | 0156 | X | 3
2 | 1156 | Y | 3
1 | 0012 | X | 3
1 | 1580 | X | 3
1 | 0112 | X | 3
1 | 1157 | X | 3


Ich möchte aber ein Ergebnis,welches so aussieht:


Nr | Nummer | Service | Name
----------------------------
6 | 0010 | X | 3
3 | 0015 | Y |
3 | 1520 | Y |
2 | 0156 | X | 1
2 | 1156 | Y |
1 | 0012 | X |
1 | 1580 | X |
1 | 0112 | X |
1 | 1157 | X |


Wer kann mir sagen, wo mein Fehler liegt bzw. wer kann mir mein Problem lösen?

Vielen Dank im Voraus
HarryW
 
Mit SUM(IF()) kann man das lösen
Wenn name = Anton, dann nimm 1, ansonsten 0. Darüber kann man dann die Summe bilden und bekommt so die Anzahl Antons
SQL:
SELECT 
    COUNT(Nummer) AS Nr, 
    Nummer, 
    Service,
    SUM(IF(name='Anton', 1, 0)) AS Anz_Anton 
FROM 
    table 
GROUP BY 
    Nummer,
    Service 
ORDER BY 
    Nr DESC;
 
Zuletzt bearbeitet von einem Moderator:
Hallo yaslaw,

vielen Dank für die tolle Hilfe - hat zwar im ersten Moment nicht funktioniert, aber dann hab ich doch noch mal das Hirn eingeschaltet, die Klammer-zu ergänzt - et voilá! Da war das Ergebnis so wie ich es wollte!

Werde mir wohl in Zukunft angewöhnen, auch meinen SQL-Code so klar strukturiert aufzuschreiben...

Jedenfalls noch mal vielen Dank, Frohes Fest & Ein Gutes Neues Jahr!
HarryW
 
Ich habe ein ähnliches Problem:

ich muss nach zwei Spalen Gruppieren UND die Menge zählen und absteigend sortieren.

SELECT f1 FROM table GROUP BY f1
dann
SELECT COUNT(f1) AS nr FROM *erster Query* GROUP BY f2 ORDER BY nr DESC

kann mir jemand helfen das in EINEN Query zu schreiben ?

thx
 
Wie wärs mit COUNT(DISITNCT ...) ?
SQL:
SELECT
  f2,
  COUNT(DISTINCT f1)
FROM
  mytable
GROUP BY
  f2
 
Zuletzt bearbeitet von einem Moderator:
Zurück