etops Geschrieben 23. Oktober 2006 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-
geloescht_JesterDay Geschrieben 23. Oktober 2006 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.
etops Geschrieben 23. Oktober 2006 Autor Geschrieben 23. Oktober 2006 Das hat leider schon mal nicht geholfen, trotzdem danke!
geloescht_JesterDay Geschrieben 23. Oktober 2006 Geschrieben 23. Oktober 2006 Funktioniert dein Problembereich, wenn du ihn ohne den ganzen Rest ausführst? EDIT: Auch mal ohne Group und Count.
etops Geschrieben 23. Oktober 2006 Autor 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?!
Jan Jansen Geschrieben 23. Oktober 2006 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 [...] ?
baba007 Geschrieben 23. Oktober 2006 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
etops Geschrieben 24. Oktober 2006 Autor 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.
geloescht_JesterDay Geschrieben 24. Oktober 2006 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?
etops Geschrieben 24. Oktober 2006 Autor 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.
Joe Kinley Geschrieben 24. Oktober 2006 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
geloescht_JesterDay Geschrieben 24. Oktober 2006 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.
Empfohlene Beiträge
Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren
Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können
Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!
Neues Benutzerkonto erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde Dich hier an.
Jetzt anmelden