Access SQL-将每行中的值除以总数(使用自联接)

Access SQL-将每行中的值除以总数(使用自联接),sql,ms-access,Sql,Ms Access,我有一张表(tblGoals),显示每位球员的进球数,例如: | Player | Goals | -------------------- | John | 6 | | Chris | 10 | | Ben | 4 | 我正在尝试编写一个查询,该查询将输出每个球员以及他们在球队总进球数中所占的百分比: | Player | PercentageGoals | ------------------------------ | John

我有一张表(tblGoals),显示每位球员的进球数,例如:

| Player  | Goals  |
--------------------
|  John   |   6    |
|  Chris  |   10   |
|  Ben    |   4    |
我正在尝试编写一个查询,该查询将输出每个球员以及他们在球队总进球数中所占的百分比:

| Player  | PercentageGoals  |
------------------------------
|  John   |       0.3        |
|  Chris  |       0.5        |
|  Ben    |       0.2        |
我已经找到了如何使用子查询来实现这一点,如图所示

SELECT 
    Player, 
    Goals/ (SELECT SUM(Goals)FROM tblGoals) AS PercentageGoals
FROM tblGoals
我展示的示例表只是为了演示我正在尝试做的事情。我使用的实际表是一个大得多的数据集,尝试使用子查询以这种方式获取百分比的速度非常慢

我以前在Access中注意到,自连接通常比子查询更有效,因此我试图弄清楚是否可以使用自连接重写上述查询

我尝试了下面的方法,但显然这是不正确的,因为t2是按球员分组的,这意味着我没有得到真正的总数,但是如果我把球员的名字漏掉了,那么我就不能加入了

SELECT 
    t1.Player, 
    t1.Goals/t2.sumGoals AS PercentageGoals
FROM 
    tbl1 t1 
INNER JOIN 
    (SELECT Player, SUM(Goals) as sumGoals 
     FROM tbl1 
     GROUP BY Player) t2 
ON t1.Player= t2.Player

有什么方法可以做到这一点吗?

我会尝试这个答案——尽管我不确定如果只使用三张唱片是否会更快

联接中的第二个表应该只包含要联接到第一个表中每个记录的所有目标的总和—笛卡尔积

然后可以将一个除以另一个:

SELECT    Player
        , Goals / TotalGoals AS Total
FROM    tblGoals, (SELECT SUM(Goals) AS TotalGoals FROM tblGoals)  

在一张大桌子上会更快吗?其思想是,在SQL中,它计算每个记录的总计,而这会将总计创建为一个表并连接到它,因此只能计算一次。

据我所知,Access足够智能,可以在子查询中没有外部查询的记录时缓存子查询的结果。我怀疑即使在大数据集中,速度也会有任何差异。不过,更正确的做法是不依赖这种缓存。感谢Darren的回复。我现在已经离开办公室了,但明天早上我会测试一下,如果快一点的话会告诉你。Cheers@ErikvonAsmuth不确定。在一个包含550891条记录的较大表中,原始查询耗时655ms,而我的版本耗时374ms(这意味着什么也没有,因为我第二次运行它时耗时640ms……不过办公室里的每个人此时都在注销)。我的速度测试代码:
Private Declare Function GetTickCount Lib“kernel32”()As Long:Sub test():Dim s As Long:s=GetTickCount:DoCmd.OpenQuery“Query2”,acViewNormal:Debug.Print GetTickCount-s:End Sub
我今天早上在我的datatset上进行了测试,它的运行速度似乎快了30%。谢谢达伦谢谢你把我从一天半的挫折中解救出来。您在子查询中进行划分的示例是一个很大的帮助。