2

我有两张桌子(MS Access)

输入

事件、用户 ID、分数
事件A, 1, 50
事件A, 2, 55
事件 B, 1, 45
事件 B, 2, 33

tbl用户

身份证、姓名
1、约翰
2、亚历克斯

我需要显示每个事件的获胜分数、事件和人的姓名。此示例的输出应为

事件、名称、分数
赛事 A,亚历克斯,55 岁
事件 B,约翰,45 岁

我试过这个来获得事件和最高分:

SELECT Max(Score), Event FROM tblInput GROUP BY Event;

但是,如果我尝试选择ID(我只是在名称的位置使用,可以在我加入表时改回名称),我被迫将其设置为我不想的聚合函数,或者将它放在 Group by 语句中,我得到类似

SELECT Max(Score) AS Score, Event, ID FROM tblInput GROUP BY Event, ID;
分数、事件、ID
165 事件A 2
173 事件A 9
170 事件A 32
211 事件B 10
224 事件B 14
256 事件C 16
188 事件C 17

任何帮助表示赞赏,抱歉格式不佳。

4

3 回答 3

2

像这样创建一个查询:

SELECT 
 Max(Score) as topscore, 
 ChildEvent 
FROM 
 T_Participation 
GROUP BY ChildEvent

然后使用第一个查询构建第二个,并且您的输入表加入了事件和分数:

select
 childEvent,
 topscore,
 StudentID
from
 query1 q inner join
 t_participation p on
 q.childevent = p.childevent and
 q.topscore = p.score

如果您有多个用户获得最高分怎么办?与事件 A 一样,用户 3 的得分为 55?

于 2012-08-30T18:43:55.407 回答
1

这是一种您可以在一个语句中执行此操作的方法。您需要创建一个事件表及其最高分数。然后将该表连接回您的输入表。您的示例将表名命名为 T_Input,但您的实现使用 T_Participation。请用 T_Participation 替换正确的表名 T_Input。

SELECT T.EVENT, T.Score,  U.Name 
FROM T_Input T
    INNER JOIN T_User U ON T.UserID = U.UserID
INNER JOIN 
(
    SELECT Event, MAX(Score) [Score]  
    FROM T_Input T2
        INNER JOIN T_User U2 ON T2.UserID = U2.UserID
    GROUP BY EVENT
)Top_scores ON T.EVENT = Top_scores.EVENT AND T.Score = Top_Scores.Score
于 2012-08-30T18:59:24.613 回答
1

你可以做:

SELECT T_Input.Event, T_User.Name, T_Input.Score
FROM
    (SELECT Max(Score), Event FROM T_Input GROUP BY Event) AS maxScores,
    T_User,
    T_Input
WHERE maxScores.score = T_Input.score
    AND maxScores.Event = T_Input.event
    AND T_User = T_Input.UserId
于 2012-08-30T19:01:30.917 回答