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?
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ś
a co wygrałem?
[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.0Model.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
[quote=bober0][code]>> Model.sum(‘war1’)
=> 128.0
Model.sum(‘war2’)
=> 1600.0Model.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=Tomash][quote=bober0][code]>> Model.sum(‘war1’)
=> 128.0
Model.sum(‘war2’)
=> 1600.0Model.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
Z jakiej książki się uczyłeś o m.in. takich niuansach?
Codziennie użeram się z takimi niuansami Pracuję z głównie z bazami danych, a Railsów hobbistycznie się douczam