给定类似于的数据集:
╔═════════╦════════╦════════╗
║ 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的重复前十进制值(后十进制值不重要)的Field3值的平均值。 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 ║
╚════════╩═════════════╩════════╩═════════╝
答案 0 :(得分:2)
删除子查询上的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 |
+--------+-------------+--------+---------+