Zum Inhalt springen

Problem mit GROUP BY und COUNT in MySQL


Empfohlene Beiträge

Geschrieben

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-

Geschrieben

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?!

Geschrieben

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 [...] ?

Geschrieben

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

Geschrieben

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?

Geschrieben

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.

Geschrieben
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.

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...