2016-07-07 21 views
1

Dies ist die SQL-Abfrage, die ich geschrieben habe. Es funktioniert, bis kurz vor der Gruppe Aussage aber sobald ich den Teil hinzufügen, bekomme ich diesen Fehler:GROUP BY-Fehler - SQL

'reading_datetime' is neither present in the group by, nor is it an aggregate function. Add to group by or wrap in first() (or first_value) if you don't care which value you get

Meine Frage:

Select A.bill_account, hour(A.reading_datetime), A.reading_value 
from (
    Select cast(cast(bill_account as double) as int)bill_account, reading_datetime, cast(reading_value as double)reading_value, `interval` 
    from amerendataorc 
    WHERE cast(cast(`interval` as double)as int) = 3600 AND reading_datetime between '2015-03-15 00:00:00' and '2016-03-14 23:59:59' 
) A  
GROUP BY A.bill_account 
HAVING (COUNT(A.bill_account)>= 8000) and (COUNT(A.bill_account) < 9500)") 

nicht sicher, wie die Gruppe wird die Abfrage vermasselt .

+1

Ich denke, Sie müssen A.reading_value innerhalb der Group BY-Klausel – ae15

+0

einschließen Lesen Sie https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html und überprüfen Sie Ihre Einstellung für 'ONLY_FULL_GROUP_BY'. –

+0

Die Fehlermeldung ist erwartetes Verhalten und entspricht dem ANSI SQL-Standard. Was nicht klar ist, ist, welche Ergebnismenge erwartet wird, dass die Anweisung zurückkehrt, d.h. was Sie erreichen wollen, indem Sie die GROUP BY-Klausel hinzufügen. Die Änderungen an der Anweisung (oder der Einstellung sql_mode) hängen von dem Ergebnis ab, das Sie zurückgeben möchten. Wir können Änderungen vorschlagen, aber ohne eine Spezifikation schätzen wir nur, was Sie von MySQL erwarten. – spencer7593

Antwort

0

nehmen Sie die Summe von Datum Zeit mit dem Lesen und Wert Lesen

Select A.bill_account, sum(hour(A.reading_datetime)), sum(A.reading_value) 
from (
    Select cast(cast(bill_account as double) as int)bill_account, reading_datetime, cast(reading_value as double)reading_value, `interval` 
    from amerendataorc 
    WHERE cast(cast(`interval` as double)as int) = 3600 AND reading_datetime between '2015-03-15 00:00:00' and '2016-03-14 23:59:59' 
) A  
GROUP BY A.bill_account 
HAVING (COUNT(A.bill_account)>= 8000) and (COUNT(A.bill_account) < 9500)") 

---- Erklärung ------------

mysql> SELECT * FROM tt where user="user1"; 
+----------+-------+ 
| duration | user | 
+----------+-------+ 
| 00:06:00 | user1 | 
| 00:02:00 | user1 | 
+----------+-------+ 
2 rows in set (0.00 sec) 

mysql> SELECT * FROM tt where user="user1" group by user; 
+----------+-------+ 
| duration | user | 
+----------+-------+ 
| 00:06:00 | user1 | 
+----------+-------+ 
1 row in set (0.00 sec) 

, wenn Sie Gruppe hinzufügen, indem Sie es gibt nur die sommerliche nach der Gruppe durch auf dieser Spalte im obigen Beispiel seine geben ersten Wert sonst können Sie Summe, max ... aggregierte Werte

0

SQL versucht, ein Problem zu vermeiden, wodurch Sie mul haben tipple hour(A.reading_datetime) pro A.Bill_Account. Gruppierung von Bill_account wird Ihnen eine Liste von einzigartigen Bill_account s geben. Dann hat es mehrere hour(A.reading_datetime) pro Bill_account und muss Ihnen helfen, wählen Sie einen.

Sie müssen nach jedem vorkommenden Wert gruppieren oder Aggregatfunktionen auf Nicht-Gruppen nach Feldern verwenden. Wenn Sie nach reading_datetime und reading_value gruppieren, listet SQL alle eindeutigen Kombinationen der drei Felder in der Gruppe auf.

MySql schlägt vor, zuerst(); max() min() sum() usw. sind alle Aggregatfunktionen, was Ihnen hilft, einen einmaligen Wert pro Bill_account zu erhalten.

Sie müssen dies auch für reading_value tun.

+0

Sie haben vergessen, MySQL Extensions zu Standard SQL zu erwähnen. –

+0

@ PM77-1 können Sie meine Antwort erarbeiten/bearbeiten? – EoinS

+0

https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html –

-2

Jedes Feld, das nicht in der Gruppierung nach Klausel enthalten ist, erfordert eine Aggregatfunktion wie SUMME, COUNT, MIN oder MAX, die in den ausgewählten Feldern enthalten sein müssen.

http://www.w3schools.com/sql/sql_groupby.asp

Um das Problem zu beheben Sie die folgende Gruppe von Klausel

GROUP BY A.bill_account, A.reading_datetime, A.reading_value

+0

Nicht zutreffend für MySQL –

+0

Wahr für MySQL, wenn sql_mode ONLY_FULL_GROUP_BY enthält. – spencer7593

0

Standard-SQL ‚verwenden, müssen doesn t Abfragen zulassen, für die die Auswahlliste auf nicht aggregierte Spalten verweist, die in der GROUP BY-Klausel nicht benannt sind. Deshalb müssen Sie diese Spalten in die GROUP BY-Klausel hinzufügen, oder Sie haben die Spalten in der SELECT-Klausel aggregieren, in Ihrem Fall:

Select A.bill_account, sum(hour(A.reading_datetime)), sum(A.reading_value)

Aber Sie müssen beurteilen, ob es für Ihre ausreichend ist Daten, um diese Spalten auf diese Weise zu summieren, und wenn dies nicht der Fall ist, fügen Sie die Spalten als GROUP BY-Kriterien hinzu.