MYSQL-Abfrage: Probleme mit COUNT und GROUP BY

NorelMars

Grünschnabel
Hallo,

seit zwei Tagen sitze ich an einem Problem:

In meiner Datenbanktabelle gibt es die Spalte "statustype". Diese kann insgesamt 3 verschiedene Einträge (string) haben. Wenn ich eine Abfrage mache, brauch ich die Ausgabe (in einem Ergebnis), wie oft welcher Status vorkommt. Wenn ich das für jeden Eintrag mache ist es kein Problem, schwierig wird es, wenn ich die Einträge nach dem Datum Gruppieren will.

Ich habe es folgendermaßen versucht:
Code:
SELECT 
IF(statustype = 'failed', COUNT(statustype),0) AS failed, 
IF(statustype = 'passed', COUNT(statustype),0) AS passed, 
IF(statustype = 'skipped', COUNT(statustype),0) AS skipped
FROM ta_data GROUP BY year(date),day(date)

Das Problem ist, dass der erste Treffer der IF Anweisung auch das Ergebnis für die weiteren Gruppenrelevanten Einträge ist und somit das Ergebnis verfälscht wird.

Als Ausgabe Ausgabe brauche ich eine Tabelle, die ungefähr so aussieht:

date-----------passed---skipped---failed
2011-08-09------3-----------2---------1

Ich hoffe, ich konnte mich einigermaßen vernünftig ausdrücken und danke schonmal für eure Hilfe.

Grüße,

Christian
 
Hallo,

ich weiß nicht ob das bei Mysql funktioniert. Bei MS Sql kannst du das so machen:

SELECT SUM(CASE WHEN statustype ='failed' THEN 1 ELSE 0 END ) AS failed,....
FROM tabelle
GROUP BY year(date),day(date)
 
Moin :)

CASE...WHEN wäre hier angebracht bzw würde zum Ergebnis führen:
Code:
SELECT 
	COUNT(CASE statustype WHEN 'failed' THEN 1 ELSE 0 END) AS failed, 
	COUNT(CASE statustype WHEN 'passed' THEN 1 ELSE 0 END) AS passed, 
	COUNT(CASE statustype WHEN 'skipped' THEN 1 ELSE 0 END) AS skipped
FROM ta_data GROUP BY year(date),day(date)

EDIT:
@ratze: funktioniert auch bei MySql ;)
 
Zuletzt bearbeitet:
Code:
SELECT 
SUM(CASE WHEN statustype = 'failed' THEN 1 ELSE 0 END ) AS failed, 
SUM(CASE WHEN statustype = 'passed' THEN 1 ELSE 0 END ) AS passed, 
SUM(CASE WHEN statustype = 'skipped' THEN 1 ELSE 0 END ) AS skipped
FROM ta_data
GROUP BY year( date ) , day( date )

Der Code bringt letztendlich das richtige Ergebnis, vielen Dank an ratze79.

Code:
SELECT 
    COUNT(CASE statustype WHEN 'failed' THEN 1 ELSE 0 END) AS failed, 
    COUNT(CASE statustype WHEN 'passed' THEN 1 ELSE 0 END) AS passed, 
    COUNT(CASE statustype WHEN 'skipped' THEN 1 ELSE 0 END) AS skipped
FROM ta_data GROUP BY year(date),day(date)

Hat mir folgendes Ergebnis geliefert:

failed passed skipped
3 3 3
3 3 3
1 1 1

Grüße,

Christian
 
Okay, der Code von ratze79 scheint letztlich bei Dir doch das richtige(re) Ergebnis zu bringen. SUM() ist wohl eher geeignet(er) als COUNT(), obwohl beide Variationen in einer meiner Projekte gleiche Ergebnisse bringen... Aber scheint dann wohl eher 'Zufall' zu sein!? Egal, Hauptsache Dir konnte geholfen werden :)

Gruss Rainer
 

Neue Beiträge

Zurück