如何从我的访问数据库中获取团队的最后5个游戏

时间:2015-11-14 17:16:02

标签: sql database ms-access

大家下面你看到了我的数据库的截图:

enter image description here

但是现在我希望能够制作一个能够计算每场比赛最后5场比赛的桌子。由于我完全是新访问数据库,我真的不知道如何做到这一点。

你们可以帮我一个人吗?

当我在下面的答案中使用第二个片段时,我得到了这些:

enter image description here

1 个答案:

答案 0 :(得分:2)

以下是根据您的数据的SQL路由。要在MS Access中使用,只需在功能区上的“创建选项卡”下创建一个新查询,并将以下SQL放在新创建的查询的SQL视图中。您可能需要根据实际的表名和/或字段调整查询。

所有球员的同一场比赛

假设每个玩家共享相同的最后五个游戏,您可以使用INNER JOIN子句中的子查询来计算所有玩家的聚合查询,以计算最后五个游戏日期。请注意:子查询,LastFiveDates可以保存为自己的查询,并直接在INNER JOIN中使用。

SELECT [LookUp to Players],
       Sum(GamesWon) As SumOfGamesWon, Sum(GamesLost) As SumOfGamesLost, 
       Sum(OwnOdds) As SumOfOwnOdds, Sum(OppOdds) As SumOfOppOdds, 
       Sum(GamesPlayed) As SumOfGamesPlayed
FROM GamesTable
INNER JOIN 
       (
        SELECT DISTINCT TOP 5 [Date] 
        FROM GamesTable 
        ORDER BY [Date] DESC
       ) As LastFiveDates           
ON GamesTable.[Date] = LastFiveDates.[Date]
GROUP BY [LookUp to Players];

为每个玩家提供不同的游戏

SIMPLE SELECT APPROACH

现在,如果玩家在过去五场比赛中有所不同,则必须加入不同的查询或联合查询。同样,下面使用内部联接中的子查询,但您可以将LastFiveGames保存为自己的存储查询并加入INNER JOIN行。

SELECT GamesTable.[LookUp to Players],
       Sum(GamesWon) As SumOfGamesWon, Sum(GamesLost) As SumOfGamesLost, 
       Sum(OwnOdds) As SumOfOwnOdds, Sum(OppOdds) As SumOfOppOdds, 
       Sum(GamesPlayed) As SumOfGamesPlayed
FROM GamesTable
INNER JOIN 
       (
        SELECT [Lookup to Players], [Date],
              (SELECT Count(*) 
               FROM GamesTable t2 
               WHERE GamesTable.[Date] <= t2.[Date] 
               AND   GamesTable.[Lookup to Players] = t2.[Lookup to Players]) AS GameOrder
        FROM GamesTable
       ) As LastFiveDates        
ON GamesTable.[Date] = LastFiveDates.[Date]
AND GamesTable.[Lookup to Players] = LastFiveDates.[Lookup to Players]
WHERE LastFiveDates.GameOrder <= 5
GROUP BY GamesTable.[LookUp to Players];

为每个玩家提供不同的游戏

VBA创建表方法

由于Access将查询作为存储查询运行的性能问题,VBA可以使用玩家的第一个查询条件,迭代地循环遍历所有不同的玩家。

Public Function GameTableStats()
    Dim db As Database
    Dim tbldef As TableDef, rst As Recordset
    Dim strSQL As String, i As Integer

    Set db = CurrentDb
    Set rst = db.OpenRecordset("SELECT DISTINCT PlayerName FROM GamesTable", dbOpenDynaset)

    For Each tbldef In db.TableDefs
        If tbldef.Name = "GamesStats" Then
            db.Execute "DROP TABLE [GamesStats]", dbFailOnError
        End If
    Next tbldef

    rst.MoveLast
    rst.MoveFirst

    i = 1
    Do While Not rst.EOF

        If i = 1 Then
            ' FIRST PLAYER (MAKE-TABLE QUERY) '
            strSQL = "SELECT GamesTable.[PlayerName]," _
                        & "       Sum(GamesWon) As SumOfGamesWon, Sum(GamesLost) As SumOfGamesLost," _
                        & "       Sum(OwnOdds) As SumOfOwnOdds, Sum(OppOdds) As SumOfOppOdds," _
                        & "       Sum(GamePlayed) As SumOfGamePlayed" _
                        & " INTO GamesStats" _
                        & " FROM GamesTable" _
                        & " INNER JOIN" _
                        & "       (" _
                        & "        SELECT DISTINCT TOP 5 [Date], [PlayerName]" _
                        & "        FROM GamesTable" _
                        & "        WHERE [PlayerName]=""" & rst!PlayerName & """" _
                        & "        ORDER BY [Date] DESC" _
                        & "       ) As LastFiveDates" _
                        & " ON GamesTable.[Date] = LastFiveDates.[Date]" _
                        & " WHERE GamesTable.[PlayerName]= """ & rst!PlayerName & """" _
                        & " GROUP BY GamesTable.[PlayerName];"
        Else
            ' ALL OTHER PLAYERS (INSERT APPEND QUERIES) '
            strSQL = "INSERT INTO GamesStats ([PlayerName], [SumOfGamesWon], [SumOfGamesLost]," _
                        & "                    [SumOfOwnOdds], [SumOfOppOdds], [SumOfGamePlayed])" _
                        & " SELECT GamesTable.[PlayerName], " _
                        & "       Sum(GamesWon) As SumOfGamesWon, Sum(GamesLost) As SumOfGamesLost, " _
                        & "       Sum(OwnOdds) As SumOfOwnOdds, Sum(OppOdds) As SumOfOppOdds,  " _
                        & "       Sum(GamePlayed) As SumOfGamePlayed " _
                        & " FROM GamesTable " _
                        & " INNER JOIN  " _
                        & "       ( " _
                        & "        SELECT DISTINCT TOP 5 [Date], [PlayerName]  " _
                        & "        FROM GamesTable  " _
                        & "        WHERE [PlayerName]=""" & rst!PlayerName & """" _
                        & "        ORDER BY [Date] DESC" _
                        & "       ) As LastFiveDates " _
                        & " ON GamesTable.[Date] = LastFiveDates.[Date]" _
                        & " WHERE GamesTable.[PlayerName]= """ & rst!PlayerName & """" _
                        & " GROUP BY GamesTable.[PlayerName];"
        End If

        db.Execute strSQL, dbFailOnError
        i = i + 1
        rst.MoveNext
    Loop

    rst.Close
    Set rst = Nothing
    Set db = Nothing

    MsgBox "Successfully created GamesStats table!", vbInformation

End Function