我正在尝试编写一个查询,它将使用sum函数将所有值加在1列中,然后除以另一个表中的元组数。出于某种原因,当我单独运行求和查询时,我得到正确的数字,但当我在下面的查询中使用它时,值是错误的。
这就是我想要做的事,但数字出错了。
select (sum(adonated) / count(p.pid)) as "Amount donated per Child"
from tsponsors s, player p;
我发现问题在于总和。当它返回25000
时,下面返回650,000select (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)中的玩家数量。
答案 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美元。