SQL joining,从子查询求和计算总聚合量

标签 sql ruby-on-rails postgresql join subquery

我已经在事件记录中完成了所有这些工作,但它不适用于分页,所以我想切换到带有 OFFSET 的 SQL 查询,这样我就可以高效地查询。 - 而不是获取 User.all,然后对相关对象进行计算,然后将其全部编译到捆绑数组中,最后将其发送到 View 我想在 find_by_sql 命令中处理计算,这样更容易管理分页等

尝试在我正在玩的小型股票市场模拟器中计算出用户的总投资额 + 他们剩余的未发明金额。

有一个股价表,每个公司的每个新股价都有多个条目,所以想要:

  • a) 从该表中选择最后一个条目以获取最新的份额 价格
  • b) ownerships 显示 users 表中的用户拥有什么 公司股份
  • c) 因此,如果我们将 shares_owned 与所有权相乘 表中包含 a) 中的最新股价,然后我们得到总数 投资金额
  • d) 一旦我们获得所有投资的总金额 公司,我们需要加上用户拥有的未投资资金 与他们相关,所以总投资 + 美元应该给我们 给定用户的总估值。
  • e) 把我搞砸的是用户在特定时间可能不拥有任何东西,这意味着他在所有权表中没有任何条目。在那种情况下,查询只需要返回他未投资的美元金额。

尝试获得“最富有”用户对每个客户和订单的总估值:

select u.id,
sum( 
    ((
  select s.price from shareprices s
  WHERE s.company_id = o.company_id and u.id = o.user_id
  ORDER BY id DESC LIMIT 1) * o.shares_owned
    ))
    + u.dollars as totalAmount
from users as u full outer join ownerships as o on u.id = o.user_id group by u.id order by totalamount ASC

对于有所有权的地方和总投资的计算结果,这会产生很好的返回,但对于只有未投资美元的用户,我怎样才能让他们显示在那个汇总列中,所以基本上它是 0(即没有拥有投资金额,因为他们在没有公司拥有股份)+ u.dollars 以获得他们拥有的金额,但我不明白如何让 SQL 做到这一点。

我希望避免需要一个 pgsql function() 来实现这个逻辑,但是如果上面没有让它变得明显,我在 SQL 方面很糟糕并且现在才学习它。我希望我的解释是可以理解的!

最佳答案

您可以添加 colaesce围绕需要将空值视为零的计算部分(我不清楚哪一部分需要)

sum(COALESCE 
    ((
  select s.price from shareprices s
  WHERE s.company_id = o.company_id and u.id = o.user_id
  ORDER BY id DESC LIMIT 1) * o.shares_owned
    )) , 0))
    + u.dollars totalAmount

关于SQL joining,从子查询求和计算总聚合量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8348488/

相关文章:

sql - 如何根据 SQL 中另一个字段的值将一个字段更改为负数

sql - 我可以为单个查询设置 JDBC 超时吗?

ruby-on-rails - Rails 3 会移除 Metal 吗?

sql - 为什么这个 SQL 查询会陷入无限循环?

mysql - 在 SQL 上检查两个非常大的数据表之间的相似性

mysql - 如果值存在于其他表中,则返回该表中的另一个值

ruby-on-rails - Ruby-Thin 服务器在生产中随机崩溃

ruby-on-rails - 何时使用 at 符号 (@)、冒号 (:) and just the variable name in rspec/rails?

postgresql - 从java调用postgres上的存储函数

function - 在 CartoDB 中创建触发器和函数