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