SQL加入,从子查询求和以计算总合计金额

时间:2011-12-01 21:23:18

标签: sql ruby-on-rails postgresql join subquery

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

尝试在我正在玩的小股市模拟器中计算用户投入的总金额+剩余的未发行金额。

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

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

试图通过“最富有”的用户获得每位客户和订单的总估值:

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函数()来实现这个逻辑,但如果上面的内容没有明显,我在SQL上很糟糕,现在才学习它。我希望我的解释是可以理解的!

1 个答案:

答案 0 :(得分:1)

你可以在计算部分周围添加一个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