0

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

这就是我试图做的,但数字是错误的。

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

我发现问题在于总和。下面返回 650,000 当它应该返回 25000

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

如果我从玩家 p 中移除它,它会得到正确的数量。但是我需要玩家表来获取玩家数量。

我有 3 个与此查询相关的表。player(pid, tid(fk)) team(tid) tsponsors(tid(fk), adonated, sid(fk)) 这是一个连接表

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

4

2 回答 2

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
于 2013-04-15T17:17:36.123 回答
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

如果团队没有赞助商,我还使用了 aLEFT OUTER JOIN来显示 0$。

于 2013-04-15T19:36:37.940 回答