2016-06-08 2 views
0

Я пытаюсь получить сумму конкретного столбца. У меня есть схема заказов, общая сумма которых хранит общую стоимость. Теперь я пытаюсь создать запрос, который будет суммировать общую стоимость всех заказов, однако не уверен, что я делаю это правильно. Вот что я до сих пор:Elixir/Phoenix сумма столбца

def create(conn, %{"statistic" => %{"date_from" => %{"day" => day_from, "month" => month_from, "year" => year_from}}}) do 

date_from = Ecto.DateTime.cast!({{year_from, month_from, day_from}, {0, 0, 0, 0}}) 
revenue = Repo.all(from p in Order, where: p.inserted_at >= ^date_from, select: sum(p.total)) 

render(conn, "result.html", revenue: revenue) 
end 

И только назвав его как <%= @revenue %> в html.eex. На данный момент он не возвращает ошибок, просто отображает случайный символ на странице, а не общий доход.

Я думаю, что мой запрос неверен, но не смог найти хорошую информацию о том, как заставить его работать должным образом. Любая помощь оценили, спасибо!

+0

Какая версия Ecto вы используете? – Gazler

+1

Попробуйте 'Repo.one' вместо' Repo.all'. – Dogbert

+0

@ Dogbert проклятье, не могу поверить, что я сделал эту ошибку, спасибо! – Ilya

ответ

4

Ваш запрос возвращает только 1 значение, а Repo.all обертывает его в список. Когда вы печатаете список, используя <%= ... %>, он обрабатывает целые числа внутри списка как кодовые страницы Unicode, и вы получаете символ с этим кодом в качестве вывода на странице. Исправление состоит в том, чтобы вместо этого использовать Repo.one, который будет возвращать значение напрямую, которое в этом случае является целым числом.

revenue = Repo.one(from p in Order, where: p.inserted_at >= ^date_from, select: sum(p.total)) 
+0

О, вот почему я получал разные символы вместо ценности. Спасибо за разработку! – Ilya

2

@ Ответ Соберта правильный. Стоит отметить, что если вы используете экто 2.0 (в настоящее время релиз-кандидата), то вы можете использовать Repo.aggregate/4:

revenue = Repo.aggregate(from p in Order, where: p.inserted_at >= ^date_from, :sum, :total) 
Смежные вопросы