访问SQL - 将每行中的值除以总计(使用自联接)

时间:2017-11-13 16:49:37

标签: sql ms-access

我有一张桌子(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

有没有办法做到这一点?

1 个答案:

答案 0 :(得分:3)

我会尝试这个作为答案 - 虽然我不确定它是否会更快,因为只使用三个记录。

您在联接中的第二个表应该只有第一个表中的每个记录加入的所有目标 - 笛卡尔积。

然后你可以将另一个分开:

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

在大桌子上是否更快?我的想法是在你的SQL中计算每条记录的总数,而这会将总数创建为一个表并加入它,所以只应计算一次。