需要使用max()过滤列表

时间:2018-11-13 01:41:04

标签: sql ms-access

问题是,我正在尝试创建一个仅显示给定候选人的最大票数的表。为此,需要组合三个不同的表(此表为西班牙语)SedesCandidatosVoto。 我已经到了执行以下几行的地步,给了我清单,其中列出了每个候选人每个选区的所有投票总数:

SELECT sedes.nombresede, candidatos.apellido & ", " & candidatos.nombre AS Candidato, count(voto.numcandidato) AS TOTAL
From (Voto INNER JOIN Sedes ON Sedes.sede_id=Voto.sede_id) 
INNER JOIN Candidatos ON Voto.numcandidato=Candidatos.numcandidato
GROUP BY nombresede, candidatos.apellido & ", " & candidatos.nombre

现在这不是我的最终产品,我需要的是仅向我显示每个机构中获得最大票数的候选人。我尝试这样做:

SELECT sedes.nombresede, candidatos.apellido & ", " & candidatos.nombre AS Candidato, count(voto.numcandidato) AS TOTAL
From (Voto INNER JOIN Sedes ON Sedes.sede_id=Voto.sede_id) 
INNER JOIN Candidatos ON Voto.numcandidato=Candidatos.numcandidato
GROUP BY nombresede, candidatos.apellido & ", " & candidatos.nombre
HAVING max(TOTAL)

但是执行时,访问提示我给TOTAL赋值,就像使用parameters子句时一样。如您所见,当尝试在Candidato内使用GROUP BY时,我也遇到麻烦,并且通过复制SELECT子句中使用的精确表达式来解决该问题。也许这与另一个问题有关?

非常感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

您的TOTAL未定义。这样无法使用别名。因此Max()试图求值,但是Access不知道您的TOTAL是什么,因此它要求输入。这应该可以解决问题:

SELECT sedes.nombresede, candidatos.apellido & ", " & candidatos.nombre AS Candidato, count(voto.numcandidato) AS total, Max(voto.numcandidato) AS maximum
From (Voto INNER JOIN Sedes ON Sedes.sede_id=Voto.sede_id) 
INNER JOIN Candidatos ON Voto.numcandidato=Candidatos.numcandidato
GROUP BY nombresede, candidatos.apellido & ", " & candidatos.nombre

答案 1 :(得分:0)

请考虑先运行汇总,然后进行相关子查询以查找每个机构下的候选人的排名变量。然后,用rank = 1选取所有记录:

Helper Query (另存为要在下面引用的查询对象)

SELECT s.nombresede, c.apellido & ', ' & c.nombre AS Candidato, 
       COUNT(voto.numcandidato) AS TOTAL
FROM (Voto v 
INNER JOIN Sedes s ON s.sede_id = v.sede_id) 
INNER JOIN Candidatos c ON c.numcandidato = v.numcandidato
GROUP BY s.nombresede, c.apellido & ', ' & c.nombre

最终查询

SELECT m.nombresede, m.Candidato, m.[rank]
FROM
   (SELECT q.nombresede, q.Candidato,
          (SELECT COUNT(*)
           FROM myHelperQuery sub
           WHERE sub.nombresede = q.nombresede
             AND sub.TOTAL >= q.TOTAL) AS [rank]
    FROM myHelperQuery q
   ) AS m
WHERE m.[rank] = 1