2013-04-15 17 views
0

我正在尝试编写一个查询,它将使用sum函数将1列中的所有值相加,然后除以另一个表中的元组计数。由于某种原因,当我运行求和查询时,我得到了正确的数字,但是当我在下面的查询中使用它时,值是错误的。在sql中使用SUM()与多个表格

这就是我试图做的,但数字出来错了。

select (sum(adonated)/count(p.pid)) as "Amount donated per Child" 
from tsponsors s, player p; 

我发现问题在总和中。下面返回650000时,它应该返回25000

select (sum(adonated)) as "Amount donated per Child" 
from tsponsors s, player p; 

如果我删除了从运动员P它得到正确的金额。不过,我需要玩家表来获得玩家人数。

我有3个与此查询相关的表。 播放器(PID,TID(FK)) 队(TID) tsponsors(TID(FK),adonated,SID(FK))这是一个连接表

我想要得到的是所有的总和捐赠给每个团队的金额(合计)并将其除以数据库计数(pid)中的玩家人数。

+0

假设表'tsponsors'和'player'以某种方式链接在一起,您需要将它放入查询中。例如:'WHERE s.playerID = p.playerID' –

+0

表结构将有助于:另外,当要求在一对多关系中的值之和必须在连接之前完成,否则最终会产生夸大/缩小的值。 – xQbert

回答

1

我猜你的赞助商是给达团队。然后你想知道赞助团队中每个孩子的捐赠比例。

你会那么需要的东西是这样的:

SELECT p.tid,(SUM(COALESCE(s.adonated,0))/COUNT(p.pid)) AS "Amount donated per Child" 
FROM player p 
LEFT OUTER JOIN tsponsors s ON s.tid=p.tid 
GROUP BY p.tid 

我也是为了显示0 $如果一支球队没有赞助商使用的LEFT OUTER JOIN

+0

感谢这工作完美我没有需要外部加入,但因为所有的球队必须有一个赞助商。 – Jeremy

1

尝试

select sum(s.adonated)/(SELECT count(p.pid) FROM player p) 
as "Amount donated per Child" 
from tsponsors s; 

你原来的查询连接2个表,没有任何条件,从而导致交叉连接。

UPDATE

SELECT ts.tid, SUM(ts.adonated),num_plyr 
FROM tsponsors ts 
INNER JOIN 
(
    SELECT tid, COUNT(pid) as num_plyr 
    FROM player 
    GROUP BY tid 
)a ON (a.tid = ts.tid) 
GROUP BY ts.tid,num_plyr 
+0

最初我选择了(sum(adonated))作为“每个孩子捐赠的金额” 来自tsponsors s,player p,team t 其中s.tid = t.tid和t.tid = p.tid; – Jeremy

+0

我的桌子是组织在哪里球队包含许多球员和球队有很多赞助商。所以我尝试加入球队的球队tid和赞助商tid。仍然给我一个虚高的数字,我想我会做错误的连接。 – Jeremy

+0

@Jeremy:那么我相信你需要在你的问题中加入表格结构以及你想达到的目标。不可能猜到你最初的想法,除非你说出来...... – a1ex07