2

我有以下示例数据集,如您所见,X 列是班级 ID,Y 列是每个班级名称,最后 Z 列是用于每个学科的其他大学班级 ID。目标是通过 X 分组获得 X 和 Z,并获得 Z(其他大学)使用的最常用 ID。

表 1:

X Z
123 22 122
123 22 123
123 22 122
256 21 256
256 21 255
341 33 400
341 33 400

结果应该是:

X Z
123 122
256 255
341 400

我尝试通过添加以下查询,但它只返回所有表中的最大值,而不仅仅是 Z 列中的每个值。

SELECT Sheet1.X, Sheet1.Z
  FROM Sheet1
  GROUP BY Sheet1.X, Sheet1.Z
  HAVING COUNT(Sheet1.Z) =
    (SELECT MAX(sheet2.count) FROM
        (SELECT Sheet1.X, Sheet1.Z, COUNT(Sheet1.Z) AS count
        FROM Sheet1
        GROUP BY Sheet1.X, Sheet1.Z) as sheet2);

关于我做错了什么的任何建议?

4

1 回答 1

0

这是 MS Access 的一大痛点。但是如果你想要X,那么你可以这样做:

SELECT s1.X, s1.Z
FROM Sheet1 as s1
GROUP BY s1.X, s1.Z
HAVING s1.Z = (SELECT TOP (1) s2.Z
               FROM Sheet1 as s2
               WHERE s2.X = s1.X
               GROUP BY s2.Z
               ORDER BY COUNT(*) DESC, s2.Z
              );

如果您想要多行以防出现平局,请使用:

SELECT s1.X, s1.Z
FROM Sheet1 as s1
GROUP BY s1.X, s1.Z
HAVING COUNT(*) IN (SELECT TOP (1) COUNT(*)
                    FROM Sheet1 as s2
                    WHERE s2.X = s1.X
                    GROUP BY s2.Z
                   );

我应该注意到,这在几乎任何其他数据库中都会更简单。

于 2021-03-03T12:24:58.847 回答