Mysql 按错误分组-SQL

Mysql 按错误分组-SQL,mysql,Mysql,这是我编写的SQL查询。它一直工作到group by语句之前,但一旦我添加了该部分,就会出现以下错误: “reading_datetime”既不在group by中,也不是聚合函数。如果您不在乎获得的值是多少,请添加到group by,或者使用first或first_值进行包装 我的问题是: Select A.bill_account, hour(A.reading_datetime), A.reading_value from ( Select cast(cast(bill_accou

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

“reading_datetime”既不在group by中,也不是聚合函数。如果您不在乎获得的值是多少,请添加到group by,或者使用first或first_值进行包装

我的问题是:

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

不确定group by是如何搞乱查询的。

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

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)")
一旦您添加group by,它将只给出上面示例中group by后该列的summery,并给出其第一个值
否则你可以得到总数,max。。。aggreagte values

SQL试图避免每个A.Bill\u帐户有多个hourA.reading\u datetime的问题。按账单账户分组将为您提供唯一账单账户的列表。然后它有多个hourA.reading\u datetime每个Bill\u帐户,需要您帮助它选择如何选择一个

您需要按出现的每个值分组,或者在非group by字段上使用聚合函数。如果您通过读取\日期时间和\值进行分组,SQL将列出分组方式中三个字段的所有唯一组合

MySql建议先使用;最大最小和等都是聚合函数,可以帮助您获得每个账单账户的一次价值


您也需要这样做才能读取\u值。

任何未包含在Group By子句中的字段都需要在所选字段中包含一个聚合函数,如SUM、COUNT、MIN或MAX

要更正此问题,您需要使用以下group by子句


GROUP BY A.bill\U account、A.reading\U datetime、A.reading\U value标准SQL不允许select列表引用GROUP BY子句中未命名的未聚合列的查询。 因此,您必须将这些列添加到GROUP BY子句,或者必须在SELECT子句中聚合这些列,在您的情况下:

选择A.bill\u账户、sumhourA.reading\u日期时间、sumA.reading\u值


但是,您必须评估数据以这种方式求和这些列是否足够,如果不够,请将这些列添加为GROUP BY条件。

我认为您需要在GROUP BY子句中包含一个.reading_值,并检查您的设置是否仅为\u FULL_GROUP_BY。错误消息是预期行为,并且符合ANSI SQL标准。不清楚的是,您希望语句返回什么结果集,即您试图通过添加GROUPBY子句来实现什么。对语句或sql_模式设置的修改将取决于您想要返回的结果。我们可以建议更改,但没有规范,我们只是猜测MySQL将返回什么。您忘记了提到标准SQL的MySQL扩展。对于MySQLTrue,则不适用于MySQLTrue,因为SQL_模式仅包括_FULL_GROUP_BY。
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)