查询整个文件,但是按单独的数据查询,按每个唯一的列元素分组

时间:2013-02-10 05:10:06

标签: mysql sql group-by average

给定类似于的数据集:

╔═════════╦════════╦════════╗
║ 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    ║
╚════════╩═════════════╩════════╩═════════╝

1 个答案:

答案 0 :(得分:2)

删除子查询上的where子句,并按prefixField2对其进行分组。

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