我挠头,因为我不知道如何在MS Access中创建一个总和,我尝试了IIF语句,DSUM语句和子查询(这是我的首选)
非常简单,我有一个足球队的名单,他们的比赛日期以及他在每场比赛中收集的积分,我想创建一个总计。
我的查询没有计算应有的总和,只是计算当前的游戏。
下面是我尝试的代码,有人可以帮忙吗?
SELECT Team, FORMAT(mDate, "yyyy-mm-dd") AS Match_Date, Pts,
SUM(IIF(FORMAT(mDate, "yyyy-mm-dd") <= FORMAT(mDate, "yyyy-mm-dd"),Pts)) AS Total_Pts
FROM
(SELECT * FROM
(SELECT home_team AS Team, match_date AS mDate, IIF(home_goals > away_goals,3,IIF(home_goals = away_goals,1,0)) AS Pts FROM A WHERE league = "Premiership" AND season = "2016 - 2017" AND home_team = "Arsenal"
UNION
SELECT away_team AS Team, match_date AS mDate, IIF(home_goals < away_goals,3,IIF(home_goals = away_goals,1,0)) AS Pts FROM A WHERE league = "Premiership" AND season = "2016 - 2017" AND away_team = "Arsenal") AS Filter ORDER BY 2 DESC) AS Test
GROUP BY Team, FORMAT(mDate, "yyyy-mm-dd"), Pts
ORDER BY 2 DESC;
答案 0 :(得分:0)
首先:不要将日期格式化为字符串,也不要将它们当作日期进行比较。
然后:为了能够将UNION
查询自身连接起来,该查询必须被写入两次,每个查询都有自己的别名。其中一个查询将用于当前游戏记录,另一个查询用于建立积分的总和。连接两侧的Team
必须相等,“运行”查询的mDate
必须小于或等于当前游戏的mDate
。由于UNION
的第一部分的记录与第二部分的记录不同,因此您可以使用UNION ALL
来加快查询速度:
SELECT Games.Team, Games.mDate, Games.Pts, SUM(Runnings.Pts) AS Total_Pts
FROM
(
SELECT home_team AS Team, match_date AS mDate, IIF(home_goals > away_goals,3,IIF(home_goals = away_goals,1,0)) AS Pts
FROM A WHERE league = "Premiership" AND season = "2016 - 2017" AND home_team = "Arsenal"
UNION ALL
SELECT away_team AS Team, match_date AS mDate, IIF(home_goals < away_goals,3,IIF(home_goals = away_goals,1,0)) AS Pts
FROM A WHERE league = "Premiership" AND season = "2016 - 2017" AND away_team = "Arsenal"
) AS Games
INNER JOIN
(
SELECT home_team AS Team, match_date AS mDate, IIF(home_goals > away_goals,3,IIF(home_goals = away_goals,1,0)) AS Pts
FROM A WHERE league = "Premiership" AND season = "2016 - 2017" AND home_team = "Arsenal"
UNION ALL
SELECT away_team AS Team, match_date AS mDate, IIF(home_goals < away_goals,3,IIF(home_goals = away_goals,1,0)) AS Pts
FROM A WHERE league = "Premiership" AND season = "2016 - 2017" AND away_team = "Arsenal"
) AS Runnings ON Games.Team = Runnings.Team AND Games.mDate >= Runnings.mDate
GROUP BY Games.Team, Games.mDate, Games.Pts
ORDER BY Games.Team, Games.mDate;