首页 > 解决方案 > 计算每种奖励类型的平均值

问题描述

对于每种奖励类型,我都在尝试计算该类型奖励被包含在存款中的平均次数。对其的一个限制是,不包括奖励类型的存款不会对该类型的平均值做出贡献,而不是 0。

下面是架构:

rewards(rewardId, rewardType, rewardValue);
deposit(depositId, depositDate, customerId);
details(depositId, rewardsId, numDeposit);

这是我的查询:

select r.rewardsId, avg(dep.depositId) 
from deposit dep join details det 
    on dep.depositId = det.depositId join rewards r 
    on r.rewardsId = det.rewardsId  
group by r.rewardsId;

我得到的答案似乎不正确,因为平均值非常高,但是当我手动计算时,每个rewardType 得到大约 2 个。有人可以指出我做错了什么吗?

标签: sqlpostgresql

解决方案


您绝对不想要 id 列的平均值。那是没有意义的。

您可能只想count(*)

select r.rewardsId, count(*) as num_rewards 
from details det join
     rewards r 
     on r.rewardsId = det.rewardsId  
group by r.rewardsId;

据我所知,你不需要这张deposit桌子。存款 ID 在详细信息中。

或者,如果您想要每次存款的奖励:

select r.rewardsId,
       count(*) * 1.0 / count(distinct det.depositId) as num_rewards 
from details det join
     rewards r 
     on r.rewardsId = det.rewardsId  
group by r.rewardsId;

推荐阅读