在sql中使用SUM()和多个表

时间:2013-04-15 17:14:44

标签: sql

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

这就是我想要做的事,但数字出错了。

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

我发现问题在于总和。当它返回25000

时,下面返回650,000
select (sum(adonated)) as "Amount donated per Child"
from tsponsors s, player p;

如果我从播放器中删除p,它会获得正确的金额。但是我需要玩家表来获得玩家数量。

我有3个与此查询相关的表。 玩家(pid,tid(fk)) 团队(TID) 赞助商(tid(fk),adonated,sid(fk))这是一个加入表

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

2 个答案:

答案 0 :(得分:1)

尝试

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

您的原始查询在没有任何条件的情况下连接2个表,这会导致交叉连接。

更新

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

答案 1 :(得分: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

如果某个团队没有赞助商,我还会使用LEFT OUTER JOIN来显示0美元。