2012-05-01 2 views
1

У меня есть следующий код в приложении Rails 3.Рельсы 3 Активные записи и суммы

@clinical_healthplan_spend = Clinical.select("ClientKey as client_key, PVID as animal_key, sum(Payments) as total_payments") 
           .where("ClinicalText LIKE 'Paid by PET HEALTH' AND PVID != 44444") 
           .order("sum(Payments) DESC") 
           .group("animal_key") 

Я пытаюсь добиться следующего:

  1. Заказать результаты по самым высоким total_payments первыми.
  2. Предел таблица записей со значением total_payment, по крайней мере, 1500.

Для первого требования;

.order("sum(Payments) DESC") 

Не работает и ни делает

.order("total_payments DESC") 

Для второго требования;

.where("total_payments > 1500") 

не работает.

Я помещаю условия в нужное место или есть другой способ сделать это при использовании опциона sum?

Любая помощь будет оценена!

ответ

4

Вместо where вы должны использовать having. И в вашем group вы должны включить все поля, у которых нет агрегата. В этом случае animal_key и client_key. Кроме этого, я не вижу никаких проблем с вашим кодом. Это должно работать:

Clinical.select('ClientKey as client_key, PVID as animal_key, sum(Payments) as total_payments') 
    .where("ClinicalText LIKE 'Paid by PET HEALTH' AND PVID != 44444") 
    .group('animal_key, client_key') 
    .having('sum(Payments) > 1500') 
    .order('sum(Payments) DESC') 
+0

Это сработало, но вы могли бы объяснить: «И в вашей группе вы должны включить все поля, у которых нет совокупности».? – dannymcc

+1

Вы хотите показать сумму (которая является [агрегатной функцией] (http://en.wikipedia.org/wiki/Aggregate_function)) платежей за комбинацию 'animal_key' и' client_key'. Таким образом, вы должны «GROUP BY» и «animal_key», и «client_key». Вы понимаете? – Mischa

+0

Да, я так думаю. Спасибо за объяснение! – dannymcc

Смежные вопросы