2015-11-14 1 views
0

Привет все ниже вы видите скриншот моей базы данных:Как получить последние 5 игр команды из моей базы данных доступа

enter image description here

Но теперь я хочу, чтобы быть в состоянии сделать таблицу, которая вычисляет каждый игрок последние 5 игр. Поскольку я совершенно новый для доступа к db, я действительно не знаю, как это сделать.

Можете ли вы, ребята, помочь мне с этим?

Когда я использую 2-й фрагмент кода в ответ ниже я получаю эти:

enter image description here

ответ

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 ВЫБРАТЬ ПОДХОД

Теперь, если игроки отличаются в последних пяти играх, вы должны присоединиться на различных запросов или запросов союза. Опять же, ниже используется подзапрос во внутреннем соединении, но вы можете сохранить это 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 CREATE TABLE ПОДХОД

Из-за проблем производительности доступа при выполнении запроса в виде сохраненного запроса, VBA может воссоздать GamesStats итеративно прокручивая все отдельные игроки, используя первое условие запроса для игрока.

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 
+0

Я пытался использовать средний, но я получаю ошибку синтаксиса в этой части: (SELECT COUNT (*) ОТ Table2 t2 WHERETable2 [Date] <= t2 [Дата] И Table2... [Поиск игроков] = t2. [Поиск игроков]) AS GameOrder – Gerben69

+0

OK Исправлено, но теперь он запрашивает значения параметров. – Gerben69

+0

Пожалуйста, посмотрите на скриншот выше. Я использую второй фрагмент, который вы опубликовали. Но получите эти значения параметров. – Gerben69

Смежные вопросы