Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Problem mit GROUP BY und COUNT in MySQL

Empfohlene Antworten

Veröffentlicht

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-

GROUP BY Spalte1, NeuerWert2

Probier mal alle vorhandenen Spalten im Select auch in deine Gruop By Klausel aufzunehmen. Da liegt oft das Problem.

Das hat leider schon mal nicht geholfen, trotzdem danke!

Funktioniert dein Problembereich, wenn du ihn ohne den ganzen Rest ausführst?

EDIT:

Auch mal ohne Group und Count.

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

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

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

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

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?

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.

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

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.

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.