Rails3 / ActiveRecord: изменение существующего запроса на группу по месяцам - PullRequest
0 голосов
/ 20 апреля 2011

модель entry.rb

def self.calculate(year, month, id)
     where(':id = entries.user_id', {    
          :id => id
     }).
     where('entries.date <= :last_day', { 
          :last_day => Date.new(year, month, 1).at_end_of_month
     }).
     select('sum(case when joint = "f" then amount_calc else 0 end) as sum_single,' + 
            'sum(case when joint = "t" then amount_calc else 0 end) as sum_joint,' + 
            'sum(case when compensation = "t" then amount_calc else 0 end) as sum_compensation')
  end

Запрос доставляет три суммы для конкретного пользователя и все записи за указанный месяц. Пока работает нормально.

То, что мне действительно нужно, будет точно таким же, но с одним значением для каждого месяца (а месяцы в разные годы должны быть в другой группе). Код должен работать как с SQLite, так и с PostgreSQL.

{Дополнительный вопрос: возможно ли получить группировку и общие суммы, как в моем исходном коде выше, в ОДНОМ запросе? Я считаю, что это невозможно ...}

1 Ответ

1 голос
/ 20 апреля 2011

SQLite

def self.calculate(year, month, id)
 where(':id = entries.user_id', {    
      :id => id
 }).
 where('entries.date <= :last_day', { 
      :last_day => Date.new(year, month, 1).at_end_of_month
 }).
 select('sum(case when joint = "f" then amount_calc else 0 end) as sum_single,' + 
        'sum(case when joint = "t" then amount_calc else 0 end) as sum_joint,' + 
        'sum(case when compensation = "t" then amount_calc else 0 end) as sum_compensation').
 group("strftime('%Y-%m', created_at)")
end

Postgre что-то вроде этого (я никогда не использовал эту базу данных)

def self.calculate(year, month, id)
 where(':id = entries.user_id', {    
      :id => id
 }).
 where('entries.date <= :last_day', { 
      :last_day => Date.new(year, month, 1).at_end_of_month
 }).
 select('sum(case when joint = "f" then amount_calc else 0 end) as sum_single,' + 
        'sum(case when joint = "t" then amount_calc else 0 end) as sum_joint,' + 
        'sum(case when compensation = "t" then amount_calc else 0 end) as sum_compensation').
 group("EXTRACT(YEAR FROM TIMESTAMP created_at)||EXTRACT(MONTH FROM TIMESTAMP created_at)")
end

Так что сначала вы должны проверить, какой адаптер используется, а затем использовать один из них.запросы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...