我有这个查询,我试图获得零售商店卖家的最大年龄(有多个城镇),并且如果有多个人具有相同(最大)年龄,则显示多个。我使用的是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 =年龄。
答案 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表。