Ecto - 如何在查询中选择组的总和和总体总和?

问题描述 投票:0回答:1

鉴于我有一个具有以下模式的表,其中

date
是非唯一的:

defmodule Record do
  field(:plays, :integer)
  field(:date, :date) 
end

我想选择每组的播放次数总和,以及所有记录的播放次数总和:

query =
  Record
  |> group_by([r], [r.date])
  |> select([r], %{
    date: r.date, 
    total_plays_per_date: fragment("coalesce(sum(?), 0)", r.plays),
    overall_total_plays: # Sum of all plays from all records
  })
elixir ecto
1个回答
0
投票

SQL 和关系数据库不容易支持这一点,而且它也不能很好地映射到 Ecto。在您显示的语法中,您尝试将每个条目的总数包含在地图记录中。执行此操作的语法会很尴尬,并且在应用程序代码中计算总和可能会更容易。

import Ecto.Query, only: [from: 2]
query = from r in Record,
          group_by: r.date,
          select: %{
            date: r.date,
            total_plays_per_date: sum(r.plays)
          }
all_plays = Repo.all(query)
overall_total_plays = all_plays |> Enum.map(& &1.total_plays_per_date) |> Enum.sum()

如果您确实需要在每条记录中包含此内容,您可以在事后添加它

all_plays = Enum.map(all_plays, &Map.put(&1, :overall_total_plays, overall_total_plays))
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.