GROUP BY错误 - SQL

时间:2016-07-07 17:01:51

标签: mysql

这是我编写的SQL查询。它一直工作到group by语句之前,但是一旦我添加了那个部分,我就会收到这个错误:

  

'reading_datetime'既不存在于组中,也不是聚合函数。如果您不关心您获得哪个值,请添加到group by或wrap in first()(或first_value)

我的查询:

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)")

不确定群组是如何弄乱查询的。

4 个答案:

答案 0 :(得分:0)

取阅读日期时间和阅读值之和

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)")

----解释------------

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)

一旦你按照它添加分组,它将只给出分组后的总和,在上面的例子中给出第一个值 否则你可以得到总和,最大......聚合值

答案 1 :(得分:0)

SQL正试图避免每个A.Bill_Account有多个hour(A.reading_datetime)的问题。按Bill_account分组会为您提供唯一Bill_account的列表。然后,每个hour(A.reading_datetime)有多个Bill_account,需要您帮助它选择一个reading_datetime

您需要按出现的每个值进行分组,或者在非分组字段中使用聚合函数。如果您按reading_valueBill_account分组,SQL将列出组中三个字段的所有唯一组合。

MySql建议使用first(); max()min()sum()等都是聚合函数,可以帮助你获得每Number.MAX_VALUE一次的值。

您还需要为reading_value执行此操作。

答案 2 :(得分:0)

标准SQL不允许选择列表引用未在GROUP BY子句中命名的非聚合列的查询。 因此,您必须将这些列添加到GROUP BY子句中,或者您必须在SELECT子句中聚合列,在您的情况下:

<a href="about.html" onMouseOver="imgOn('about_btn')" onMouseOut="imgOff('about_btn')"><img border=0 src="images/buttons/about_btn.png" draggable="false" width="105" name="about_btn"/></a>

但是你必须评估你的数据是否足以以这种方式对这些列求和,如果不是,则将列添加为GROUP BY标准。

答案 3 :(得分:-2)

任何未包含在“分组条款”中的字段都需要将SUM,COUNT,MIN或MAX等聚合函数包含在“选定”字段中。

pd.DataFrame.to_json

要解决此问题,您需要使用以下分组

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