Suma sum w AR

Mam w tabeli 3 kolumny (war1, war2, war3).
Chce zrobić sumę sum tych trzech kolumn. (select sum(war1) + sum(war2) + sum(war3) from tabela)

Jest możliwość zrobić to w AR jednym zapytaniem?

nie wiem, ale co by było szybko to może coś takiego wystarczy?

Record.sum(:war1) + Record.sum(:war2) + Record.sum(:war3)

?

Model.find(:all, :select => “sum(col1) + sum(col2) AS sumki”)

Model.sum('pole_a + pole_b + pole_c')

Wygrałeś :slight_smile:

a co wygrałem? :stuck_out_tongue_winking_eye:


:wink:

[quote=sevos]nie wiem, ale co by było szybko to może coś takiego wystarczy?

Record.sum(:war1) + Record.sum(:war2) + Record.sum(:war3)

?[/quote]
To nie idzie w jednym zapytaniu tylko w trzech, a chciałbym, żeby szło w jednym bo w stuacji gdy masz 6-7 kolumn to już robi znaczenie w wydajności.

[quote=seban]Model.sum('pole_a + pole_b + pole_c')
[/quote]
Seban, nie bardzo,

bo to zapytanie powoduje wykonanie sqla

(select sum(war1 + war2 + war3) from tabela)

a patrzac na konsole

[code]>> Model.sum(‘war1’)
=> 128.0

Model.sum(‘war2’)
=> 1600.0

Model.sum(‘war1 + war2’)
=> “728”[/code]
co widać nie daje poprawnego wyniku.

Model.find(:all, :select => “sum(col1) + sum(col2) AS sumki”)[/quote]
Działa, dzięki Tomash :slight_smile:

[quote=bober0][code]>> Model.sum(‘war1’)
=> 128.0

Model.sum(‘war2’)
=> 1600.0

Model.sum(‘war1 + war2’)
=> “728”[/code]
co widać nie daje poprawnego wyniku.[/quote]
A to to już wymaga zbadania, bo powinno działać dokładnie jak moje rozwiązanie :confused:

[quote=Tomash][quote=bober0][code]>> Model.sum(‘war1’)
=> 128.0

Model.sum(‘war2’)
=> 1600.0

Model.sum(‘war1 + war2’)
=> “728”[/code]
co widać nie daje poprawnego wyniku.[/quote]
A to to już wymaga zbadania, bo powinno działać dokładnie jak moje rozwiązanie :/[/quote]
A jednak działa nie do końca tak samo, szczególnie dziwny jest to że wynikiem string a nie float.

Może kolumny są innych typów i AR sobie z tym nie radzi. Najlepiej zbadać to i ewentualnie zaołożyć ticketa. bober0 sprawdź czy idą takie same zapytania do bazy

Obie kolumny to double precision (postgresql).

Zapytanie

Model.sum('pole_a + pole_b + pole_c')

daje sqla w logach

select sum(pole_a + pole_b + pole_c) from models

Jedyne o czym jeszcze nie powiedziałem to że czasem wartościami jest null/nil i może wtedy się gubić,
nie umiejąc sobie go zrzutować, to jedyne co mi się nasuwa.

ale wrzucając bezpośrednio do managera zapytanie sql:

select sum(pole_a) + sum(pole_b) + sum(pole_c) from models

daje poprawny wynik, więc chyba rozwiązanie Tomasha jest najlepsze chociaz mało eleganckie z uwagi na to co zwraca.

[quote=bober0]select sum(pole_a + pole_b + pole_c) from models
Jedyne o czym jeszcze nie powiedziałem to że czasem wartościami jest null/nil i może wtedy się gubić,
nie umiejąc sobie go zrzutować, to jedyne co mi się nasuwa.[/quote]
Nie tyle gubi się, co w specyficzny (ale poprawny) sposób wykonuje działania z null. Null nie jest tożsamy z zerem.
null + 1 daje w wyniku null!

Można użyć funkcji coalesce:

Model.sum('coalesce(pole_a,0) + coalesce(pole_b,0) + coalesce(pole_c,0)')

Nareszcie ktoś prawdziwie kompetentny w SQLu :slight_smile:
Z jakiej książki się uczyłeś o m.in. takich niuansach?

Codziennie użeram się z takimi niuansami :wink: Pracuję z głównie z bazami danych, a Railsów hobbistycznie się douczam :slight_smile: