2016-09-27 4 views
4

私はテーブルdata_summariesを持っています。それはitem_id INT(11),user_grouping TEXTおよびvalue DECIMAL(10,2)のような列を持ちます。私はuser_groupingによってグループの結果クエリを作ってみると失敗したこと、valueAVGによってそれらを注文した場合MySQLの特定のGROUP BY基準でAVG値をORDER BYできない

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 | 
+---------------+-----------+-----------+ 

ORDER BY句はよう何かをやっているように見えるん注文を変更します:

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 | 
+---------------+-----------+-----------+ 

一方、注文は予想通りvalueの作品:

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 | 
+---------------+-----------+-----------+ 

Iグループであれば代わりにitem_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 | 
+---------+-----------+-----------+ 

平均?

答えて

3

これはUnexpected order for grouped queryを参照してください。avg()と、text - 列のグループ化が含まれています。 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 

がアップデート:上のグループ化された

クエリ:

バグがMySQL 5.7.17に固定されています。 BLOBベースの型の列であり、AVG()、VAR_POP()、またはSTDDEV_POP()集計関数の結果で並べ替えられた場合、InnoDBテンポラリテーブルが使用された場合、結果は誤った順序で返されます。 (Bug#22275357、Bug#79366)

+0

ああ、ありがとう!私のグーグルグーグルはそのバグ報告を出さなかった。この回避策により、望ましい結果が得られます。 –