给定的数据集类似于:
╔═════════╦════════╦════════╗
║ 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 ║
╚═════════╩════════╩════════╝对于每个唯一的Field3元素,我需要为Field1的重复十进制前值(后十进制值并不重要)找到Field2值的平均值。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 ║
╚════════╩═════════════╩════════╩═════════╝发布于 2013-02-10 05:23:42
删除子查询上的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输出,
+--------+-------------+--------+---------+
| 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 |
+--------+-------------+--------+---------+https://stackoverflow.com/questions/14794913
复制相似问题