etops Geschrieben 23. Oktober 2006 Teilen Geschrieben 23. Oktober 2006 Hallo, ich habe ein MySQL-Problem mit GROUP BY, und zwar habe ich in der Abfrage ein COUNT(IF()) drin, das eine Größer/Kleiner - Bedingung in Verbindung mit einer Addition abprüfen soll. Es funktioniert sonst alles bis auf dieses COUNT; ich bekomme da immer "Invalid use of GROUP BY", wenn dieser Abschnitt ausgeführt wird. Habe ich irgendwo einen Denkfehler oder warum funktioniert die Abfrage nicht? Die Abfrage lautet folgendermaßen: SELECT CONCAT( Spalte1, '-', Spalte2 ), COUNT( CONCAT( Spalte3, '-', Spalte4 ) ), [blabla] [hier funktionierts] COUNT(IF( (SEC_TO_TIME( (UNIX_TIMESTAMP( CONCAT( Datum2, ' ', Zeit2 ) ) ) - ( UNIX_TIMESTAMP( CONCAT( Datum1, ' ', Zeit1 ) ) ) ) ) > (SEC_TO_TIME( (UNIX_TIMESTAMP( CONCAT( Datum4, ' ', Zeit4 ) ) ) - ( UNIX_TIMESTAMP( CONCAT( Datum3, ' ', Zeit3 ) ) ) ) ),1,NULL) ) AS NeuerWert1, [fertig funktionierend] [hier ist der Problembereich] COUNT(IF( (SEC_TO_TIME( (UNIX_TIMESTAMP( CONCAT( Datum2, ' ', Zeit2 ) ) ) - ( UNIX_TIMESTAMP( CONCAT( Datum1, ' ', Zeit1 ) ) ) )) > (SEC_TO_TIME( AVG( (UNIX_TIMESTAMP( CONCAT( Datum2, ' ', Zeit2 ) ) ) - ( UNIX_TIMESTAMP( CONCAT( Datum1, ' ', Zeit1 ) ) ) ) + STD( (UNIX_TIMESTAMP( CONCAT( Datum2, ' ', Zeit2 ) ) ) - ( UNIX_TIMESTAMP( CONCAT( Datum1, ' ', Zeit1 ) ) ) ) )),1,NULL) ) AS NeuerWert2, [Ende Problem] FROM tbl_bla WHERE Datum2 BETWEEN '2006-01-01' AND '2006-09-30' GROUP BY Spalte1, NeuerWert2 ORDER BY Spalte1, NeuerWert2 Danke und Gruß -etops- Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
geloescht_JesterDay Geschrieben 23. Oktober 2006 Teilen Geschrieben 23. Oktober 2006 GROUP BY Spalte1, NeuerWert2 Probier mal alle vorhandenen Spalten im Select auch in deine Gruop By Klausel aufzunehmen. Da liegt oft das Problem. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
etops Geschrieben 23. Oktober 2006 Autor Teilen Geschrieben 23. Oktober 2006 Das hat leider schon mal nicht geholfen, trotzdem danke! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
geloescht_JesterDay Geschrieben 23. Oktober 2006 Teilen Geschrieben 23. Oktober 2006 Funktioniert dein Problembereich, wenn du ihn ohne den ganzen Rest ausführst? EDIT: Auch mal ohne Group und Count. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
etops Geschrieben 23. Oktober 2006 Autor Teilen Geschrieben 23. Oktober 2006 Nein, auch da funktioniert die Abfrage nicht (wieder "Invalid use of GROUP-function") Es kann ja kaum daran liegen, daß ich innerhalb von COUNT noch eine Addition durchführe?! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Jan Jansen Geschrieben 23. Oktober 2006 Teilen Geschrieben 23. Oktober 2006 die Spalte "CONCAT( Spalte1, '-', Spalte2 )" taucht in deinem Group by nicht auf, dafür gruppierst du nach einer "Spalte1", die in deinem select nicht auftaucht klappt es mit [...] GROUP BY CONCAT( Spalte1, '-', Spalte2 ), NeuerWert2 [...] ? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
baba007 Geschrieben 23. Oktober 2006 Teilen Geschrieben 23. Oktober 2006 klappt es mit [...] GROUP BY CONCAT( Spalte1, '-', Spalte2 ), NeuerWert2 [...] ? es muss damit klappen. concat erzeugt eine neue spalte, klare sache. eleganter wäre oben CONCAT(****) as irgend-was und dann unten group by irgend-was Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
etops Geschrieben 24. Oktober 2006 Autor Teilen Geschrieben 24. Oktober 2006 @baba007 Ich hab das CONCAT benannt (hab ich hier vergessen darzustellen, sorry) und nach dieser Spalte wird auch gruppiert. Und trotzdem geht es leider nicht. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
geloescht_JesterDay Geschrieben 24. Oktober 2006 Teilen Geschrieben 24. Oktober 2006 Was willst du mit diesem SQL überhaupt erreichen? Ich hab das mal nachgebaut. SELECT SEC_TO_TIME(UNIX_TIMESTAMP( CONCAT( Datum2, ' ', Zeit2 ) ) ) - ( UNIX_TIMESTAMP( CONCAT( Datum1, ' ', Zeit1 ) ) ) > SEC_TO_TIME( AVG( (UNIX_TIMESTAMP( CONCAT( Datum2, ' ', Zeit2 ) ) ) - ( UNIX_TIMESTAMP( CONCAT( Datum1, ' ', Zeit1 ) ) ) ) + STD( (UNIX_TIMESTAMP( CONCAT( Datum2, ' ', Zeit2 ) ) ) - ( UNIX_TIMESTAMP( CONCAT( Datum1, ' ', Zeit1 ) ) ) ) ) FROM `test` t ; liefert z.B. immer nur 1 Wert, weil AVG ja z.B. schon eine Zusammenfassung der Ergebnisse ist. Das hier SELECT IF( SEC_TO_TIME(UNIX_TIMESTAMP( CONCAT( Datum2, ' ', Zeit2 ) ) ) - ( UNIX_TIMESTAMP( CONCAT( Datum1, ' ', Zeit1 ) ) ) > SEC_TO_TIME( AVG( (UNIX_TIMESTAMP( CONCAT( Datum2, ' ', Zeit2 ) ) ) - ( UNIX_TIMESTAMP( CONCAT( Datum1, ' ', Zeit1 ) ) ) ) + STD( (UNIX_TIMESTAMP( CONCAT( Datum2, ' ', Zeit2 ) ) ) - ( UNIX_TIMESTAMP( CONCAT( Datum1, ' ', Zeit1 ) ) ) ) ), 1, NULL) S1 FROM `test` geht auch. liefert eben 1 oder NULL (wenn man das größer als kleiner schreibt). Aber liefert auch nur 1 Ergebnis. Was willst du dann noch zählen? Ach ja, der Count um das letzte geht nicht mehr. Der dürfte bei dir wohl das Problem sein. Frage ist nur, was tust du da überhaupt? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
etops Geschrieben 24. Oktober 2006 Autor Teilen Geschrieben 24. Oktober 2006 Was ich tun möchte: ich möchte zählen, wieviele Ereignisse es gab, deren zeitliche Länge größer war als die durchschnittliche Länge aller Ereignisse zuzüglich einer Standardabweichung. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Joe Kinley Geschrieben 24. Oktober 2006 Teilen Geschrieben 24. Oktober 2006 Weiss net obs hilft, aber Group By kann net mit ALiasen aus dem Select klarkommen. Versuch also da nochmal den gleichen KRams wie im Select zu benutzen... evtl. klappt das ja Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
geloescht_JesterDay Geschrieben 24. Oktober 2006 Teilen Geschrieben 24. Oktober 2006 Was ich tun möchte: ... Mach das doch mit mehreren Abfragen oder mit Subselects. Weil das SQL erfüllt wohl so wie es geschrieben wurde diesen Zweck nicht EDIT: Kann auch so gar nicht gehen, weil du im selben SQL die Anzahl der Ergebnisse willst und den Durchschnitt errechnen... Je nach Version und Antwortzeit etc. würd ich das als Subselect machen oder die Durchschnittszeit vorher berechnen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.