MS Access - 聚合函数和最大值

时间:2012-01-25 11:52:52

标签: ms-access

我有这个查询,我试图获得零售商店卖家的最大年龄(有多个城镇),并且如果有多个人具有相同(最大)年龄,则显示多个。我使用的是Microsoft Access 2010.以下是查询:

SELECT Linnad.Linn, Myyjad.Nimi, Max(Myyjad.Vanus) As Vanus
FROM Linnad INNER JOIN Myyjad ON Linnad.LinnID = Myyjad.LinnID
GROUP BY Linnad.Linn, Myyjad.Nimi
ORDER BY Linnad.Linn;

问题是,它似乎忽略了MAX,只显示了所有的值,我无法通过Myyjad.Nimi删除该组,因为它给了我一个错误,即Myyjad.Nimi不包含聚合函数。

输出应该是: 镇 - 名称 - 最大(年龄)

此外,Linn = Town,Nimi =姓名,Vanus =年龄。

3 个答案:

答案 0 :(得分:1)

我想你想要:

SELECT Linnad.Linn, Myyjad.Nimi, Myyjad.Vanus
FROM Linnad INNER JOIN Myyjad ON Linnad.LinnID = Myyjad.LinnID
WHERE DateValue(Myyjad.Vanus) 
      = (SELECT Max(DateValue(Myyjad.Vanus)) FROM Myyjad) 
ORDER BY Linnad.Linn

每组前N名:

SELECT Linnad.Linn,  Myyjad.Nimi, Myyjad.Vanus
FROM FROM Linnad INNER JOIN Myyjad ON Linnad.LinnID = Myyjad.LinnID
WHERE Myyjad.ID In (
    SELECT Top 1 m.ID 
    FROM Myyjad m  
    WHERE m.LinnID=Linnad.ID 
    ORDER BY m.Vanus Desc, m.ID)

答案 1 :(得分:1)

Linn(镇)和Nimi(姓名)的分组告诉db引擎为每个城镇和名称组合提供一行,并显示每个组合的最大Vanus(年龄)。从逻辑上讲,这不是你想要的。您需要年龄与该镇最大年龄相同的每个人的姓名。

首先验证您是否可以检索每个LinnID的最大年龄。

SELECT
    LinnID,
    Max(Vanus) As MaxOfVanus
FROM
    Myyjad
GROUP BY LinnID;

如果可行,您可以将其保存为“qryTownAge”,然后在另一个查询中使用它(在LinnID上)与Linnad一起使用。这将允许您检索匹配的Linn。

SELECT l.LinnID, l.Linn, q.MaxOfVanus
FROM
    Linnad AS l
    INNER JOIN qryTownAge AS q
    ON l.LinnID = q.LinnID
ORDER BY l.Linn;

如果可行,请将其另存为qryTownAge2。然后尝试这个查询。

SELECT q.Linn, q.MaxOfVanus, m.Nimi
FROM
    qryTownAge2 AS q
    INNER JOIN Myyjad AS m
    ON (
        m.LinnID = q.LinnID
        AND m.Vanus = q.MaxOfVanus
        )
ORDER BY q.Linn;

如果一切正常,您可以创建一个完成所有操作的查询。但是,一步一步地执行此操作可以帮助我们查明错误。

答案 2 :(得分:1)

我认为这可能是你要找的东西:

SELECT L.Linn, M.Nimi, M.Vanus
FROM Linnad As L,
(
SELECT M2.LinnID, M2.Nimi, M2.Vanus
FROM Myyjad As M2
WHERE M2.Vanus = (SELECT Max(Z.Vanus) FROM Myyjad As Z WHERE Z.LinnID = M2.LinnID)
) As M
WHERE M.LinnID = L.LinnID

这将执行一个子选择以获取所有Nimi显示最大Vanus的Linn ID列表,然后我们通过LinnID将此子选择链接回Linnad表。