2016-06-08 18 views
0

Ich versuche, die Summe der einzelnen Spalte zu erhalten. Ich habe ein Schema von Bestellungen mit dem Feld total, das den Gesamtpreis speichert. Jetzt versuche ich eine Abfrage zu erstellen, die den Gesamtwert aller Bestellungen summiert, aber nicht sicher, ob ich es richtig mache. Hier ist das, was ich bisher:Elixir/Phoenix Summe der Spalte

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 

Und es wie <%= @revenue %> im html.eex aufrufen. Ab sofort gibt es keine Fehler zurück, sondern nur zufällige Symbol auf der Seite, anstelle der Gesamteinnahmen.

Ich denke, meine Abfrage ist falsch, konnte aber keine guten Informationen darüber finden, wie es richtig funktioniert. Jede Hilfe geschätzt, danke!

+0

Welche Version von Ecto verwenden Sie? – Gazler

+1

Versuchen Sie 'Repo.one' anstelle von' Repo.all'. – Dogbert

+0

@Dogbert verdammt, kann nicht glauben, dass ich diesen Fehler gemacht habe, danke! – Ilya

Antwort

4

Ihre Abfrage gibt nur einen Wert zurück, und Repo.all fügt sie in eine Liste ein. Wenn Sie eine Liste drucken, die <%= ... %> verwendet, behandelt es Integer in der Liste als Unicode-Codepoints und Sie erhalten das Zeichen mit dem Codepoint als Ausgabe auf der Seite. Der Fix ist stattdessen Repo.one zu verwenden, der den Wert direkt zurückgibt, der in diesem Fall eine Ganzzahl ist.

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

Oh, deshalb habe ich verschiedene Symbole anstelle des Wertes bekommen. Danke für die Ausarbeitung! – Ilya

2

@ Dogberts Antwort ist korrekt. Es ist erwähnenswert, dass, wenn Sie Ecto 2.0 verwenden (derzeit in der Release Candidate), dann können Sie Repo.aggregate/4 verwenden:

revenue = Repo.aggregate(from p in Order, where: p.inserted_at >= ^date_from, :sum, :total) 
Verwandte Themen