在 SQL MS Access 中添加 Max(Count(column))

问题描述

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

工作表 1:

X Y 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);

对我做错了什么有什么建议吗?

解决方法

这对于 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
HAVING COUNT(*) IN (SELECT TOP (1) COUNT(*)
                    FROM Sheet1 as s2
                    WHERE s2.X = s1.X
                    GROUP BY s2.Z
                   );

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