在MySQL中,不能按具有特定分组条件的平均值排序
我有一个表在MySQL中,不能按具有特定分组条件的平均值排序,mysql,sql,sql-order-by,aggregate-functions,Mysql,Sql,Sql Order By,Aggregate Functions,我有一个表数据\u摘要。它有诸如item\u id INT(11)、user\u分组文本和value DECIMAL(10,2)等列 如果我尝试通过user\u grouping对结果进行分组,并根据value的AVG对结果进行排序,则会失败: SELECT user_grouping, AVG(value) AS avg_value, SUM(value) AS sum_value FROM data_summaries GROUP BY user_grouping ORDER BY avg_
数据\u摘要
。它有诸如item\u id INT(11)
、user\u分组文本
和value DECIMAL(10,2)
等列
如果我尝试通过user\u grouping
对结果进行分组,并根据value
的AVG
对结果进行排序,则会失败:
SELECT user_grouping, AVG(value) AS avg_value, SUM(value) AS sum_value
FROM data_summaries
GROUP BY user_grouping
ORDER BY avg_value
+---------------+-----------+-----------+
| user_grouping | avg_value | sum_value |
+---------------+-----------+-----------+
| London | 50.609733 | 18978.65 |
| Paris | 50.791733 | 19046.90 |
| New York | 51.500400 | 2575.02 |
| NULL | 49.775627 | 18665.86 |
+---------------+-----------+-----------+
orderby
子句似乎确实在做一些事情,因为它确实改变了顺序:
SELECT user_grouping, AVG(value) AS avg_value, SUM(value) AS sum_value
FROM data_summaries
GROUP BY user_grouping
+---------------+-----------+-----------+
| user_grouping | avg_value | sum_value |
+---------------+-----------+-----------+
| NULL | 49.775627 | 18665.86 |
| New York | 51.500400 | 2575.02 |
| London | 50.609733 | 18978.65 |
| Paris | 50.791733 | 19046.90 |
+---------------+-----------+-----------+
另一方面,按值的和
进行排序,效果与预期一致:
SELECT user_grouping, AVG(value) AS avg_value, SUM(value) AS sum_value
FROM data_summaries
GROUP BY user_grouping
ORDER BY sum_value
+---------------+-----------+-----------+
| user_grouping | avg_value | sum_value |
+---------------+-----------+-----------+
| New York | 51.500400 | 2575.02 |
| NULL | 49.775627 | 18665.86 |
| London | 50.609733 | 18978.65 |
| Paris | 50.791733 | 19046.90 |
+---------------+-----------+-----------+
如果我改为按item\u id
分组,则按AVG
排序有效:
SELECT item_id, AVG(value) AS avg_value, SUM(value) AS sum_value
FROM data_summaries
GROUP BY item_id
+---------+-----------+-----------+
| item_id | avg_value | sum_value |
+---------+-----------+-----------+
| 4 | 49.318225 | 11392.51 |
| 1 | 49.737835 | 11489.44 |
| 2 | 50.420606 | 11647.16 |
| 6 | 51.024242 | 11786.60 |
| 5 | 51.456537 | 11886.46 |
| 3 | 53.213000 | 1064.26 |
+---------+-----------+-----------+
我需要如何更改第一个查询才能按平均值排序?这是一个MySQL错误,请参阅,它涉及到avg()
以及按文本
-列进行分组。它仍然在MySQL 5.7.15中打开
作为一种解决方法,您可以将数据类型更改为,例如,varchar
。如果您不需要索引来加速,则强制转换也应该有效:
SELECT cast(user_grouping as char(200)), AVG(value) AS avg_value, SUM(value) AS sum_value
FROM data_summaries
GROUP BY cast(user_grouping as char(200))
ORDER BY avg_value
更新:
该缺陷在以下方面得到修复:
如果使用InnoDB临时表,则分组在基于BLOB类型的列上并根据AVG()、VAR_POP()或STDDEV_POP()聚合函数的结果排序的查询将以错误的顺序返回结果。(错误22275357,错误79366)
啊,谢谢你!我在谷歌上搜索都没有得到那个bug报告。该变通方法可产生所需的结果。