sql - 计算每种奖励类型的平均值

标签 sql postgresql

对于每种奖励类型,我试图计算存款中包含该类型奖励的平均次数。它的一个限制是,不包括奖励类型的存款不会对该类型的平均值做出贡献,而不是 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 个。有人可以指出我做错了什么吗?

最佳答案

由于您只想计算包含奖励类型的存款,那么您可以这样计算它们:

select t.rewardsId, avg(t.counter) from (
  select 
    r.rewardsId, 
    sum(case when det.rewardsId is null then 0 else 1 end) counter
  from deposit dep join details det 
  on dep.depositId = det.depositId join rewards r 
  on r.rewardsId = det.rewardsId  
  group by r.rewardsId, dep.depositId
) t
group by t.rewardsId

关于sql - 计算每种奖励类型的平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55093522/

相关文章:

sql - 如何避免N+1查询

python - 如何用python修改存储过程的输入值

sql - 如何将 Oracle 中的 substrb 转换为 Postgresql

postgresql - Postgres:最新镜像上的Docker容器无法启动

sql - 更新/删除没有主键的列中的任意行

sql-server - 如何在 Node.JS 应用程序中同时支持 PostgreSQL 和 SQL Server?

mysql - 如何在 SQL 中获取下个月 21 岁生日的学生?

php - 数据库架构更改时检查表名的有效方法?

postgresql - 如何在不重复的情况下提取年份

sql - 左连接返回较少的行