给定的数据集类似于:
╔═════════╦════════╦════════╗
║ FIELD1 ║ FIELD2 ║ FIELD3 ║
╠═════════╬════════╬════════╣
║ 11-1.01 ║ Jacob ║ 3 ║
║ 11-1.02 ║ Jacob ║ 4 ║
║ 12-2.01 ║ Jacob ║ 3 ║
║ 13-3.01 ║ Jacob ║ 4 ║
║ 13-3.02 ║ Jacob ║ 3 ║
║ 13-3.03 ║ Jacob ║ 2 ║
║ 11-1.01 ║ Chris ║ 3 ║
║ 11-1.02 ║ Chris ║ 4 ║
║ 12-2.01 ║ Chris ║ 2 ║
║ 13-3.01 ║ Chris ║ 4 ║
║ 13-3.02 ║ Chris ║ 3 ║
║ 13-3.03 ║ Chris ║ 2 ║
║ 11-1.01 ║ Mike ║ 4 ║
║ 11-1.02 ║ Mike ║ 3 ║
╚═════════╩════════╩════════╝
我需要为每个惟一的Field2元素找到Field1的重复pre-decimal值的Field3平均值(后面的decimal值并不重要)。
Field1值定义为CHAR类型,长度为7位数(包括连字符和小数)。
我目前能够通过使用WHERE子句找到一个特定Field2元素的平均值,如下所示:
SELECT prefix, COUNT(prefix), Field2, FORMAT(AVG(suffix),2)
FROM
(
SELECT LEFT(Field1,4) AS prefix, Field3 AS suffix, Field2
FROM mytable WHERE Field2 = 'Jacob'
)x
GROUP BY prefix;
但是,我的目标是遍历整个文件并为每个不同的Field2元素找到平均值,因此我不需要像运行唯一Field2名称那样多次运行程序。
我觉得这应该是对我当前代码的一个相当简单的更改,但是不知道该怎么做。
也许有更好的方法在表中构造这些数据,尽管这是我接收数据的方式,并且必须使用它(我不太了解它)。
更新1
期望结果
╔════════╦═════════════╦════════╦═════════╗
║ PREFIX ║ PREFIXCOUNT ║ FIELD2 ║ AVERAGE ║
╠════════╬═════════════╬════════╬═════════╣
║ 11-1 ║ 2 ║ Chris ║ 3.50 ║
║ 12-2 ║ 1 ║ Chris ║ 2.00 ║
║ 13-3 ║ 3 ║ Chris ║ 3.00 ║
║ 11-1 ║ 2 ║ Jacob ║ 3.50 ║
║ 12-2 ║ 1 ║ Jacob ║ 3.00 ║
║ 13-3 ║ 3 ║ Jacob ║ 3.00 ║
║ 11-1 ║ 2 ║ Mike ║ 3.50 ║
╚════════╩═════════════╩════════╩═════════╝
最佳答案
删除子查询上的where
子句,并按prefix
和Field2
对它们进行分组。
SELECT prefix,
COUNT(prefix) PrefixCount,
Field2,
FORMAT(AVG(suffix),2) Average
FROM
(
SELECT LEFT(Field1,4) AS prefix,
Field3 AS suffix,
Field2
FROM TableName
) x
GROUP BY prefix, Field2
ORDER BY Field2, prefix
SQLFiddle Demo
输出,
+--------+-------------+--------+---------+
| PREFIX | PREFIXCOUNT | FIELD2 | AVERAGE |
+--------+-------------+--------+---------+
| 11-1 | 2 | Chris | 3.50 |
| 12-2 | 1 | Chris | 2.00 |
| 13-3 | 3 | Chris | 3.00 |
| 11-1 | 2 | Jacob | 3.50 |
| 12-2 | 1 | Jacob | 3.00 |
| 13-3 | 3 | Jacob | 3.00 |
| 11-1 | 2 | Mike | 3.50 |
+--------+-------------+--------+---------+
关于mysql - 查询整个文件,但按单独的数据(按每个唯一的列元素分组),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14794913/