1

给定一个类似于以下的数据集:

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

1 回答 1

2

删除where子查询上的子句并按 and 对它们进行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    |
+--------+-------------+--------+---------+
于 2013-02-10T05:23:42.433 回答