SQL-соединение, суммирование из подзапросов для расчета общей суммы - PullRequest
1 голос
/ 02 декабря 2011

Я сделал все это в активной записи, но он не будет работать с нумерацией страниц, поэтому я хотел бы переключиться на SQL-запрос с OFFSET, чтобы я мог выполнять запросы эффективно. - Вместо того, чтобы получать User.all, затем обрабатывать вычисления для связанных объектов, а затем компилировать все это в связанный массив и, наконец, отправлять его в представление, которое я хотел бы обработать с помощью команды find_by_sql, чтобы им было легче управлять нумерация страниц и т. д.

Попытка вычислить общую сумму инвестированных пользователей + их остаточные непроизведенные суммы в моем маленьком симуляторе фондового рынка, с которым я играю.

Иметь таблицу цен акций, в которой есть несколько записей для каждой новой цены акций для каждой компании, поэтому необходимо:

  • а) выберите последнюю запись из этой таблицы, чтобы получить последнюю долю цена
  • б) владения показывают, что пользователям из таблицы пользователей принадлежит, что акции компании
  • в) Так что, если мы умножим акции, принадлежащие владельцам Таблица с последней ценой акции из а), то мы получаем общее инвестированная сумма
  • 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 () для достижения этой логики, но если вышеприведенное не делает это очевидным, я ужасен в SQL и изучаю его только сейчас. Надеюсь, мое объяснение даже понятно!

1 Ответ

1 голос
/ 02 декабря 2011

Вы можете добавить 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...