4

私はこの方法を使用しています:

  def self.lines_price_report(n)
    Income.group('date(filled_at)').having("date(filled_at) > ?", Date.today - n).sum(:lines_price)
  end

Herokuでこのエラーが発生します:

PG::Error: ERROR:  column "incomes.filled_at" must appear in the GROUP BY clause 
or be used in an aggregate function

どうすればこれを修正できますか?ありがとうございました。

実行されたクエリ:

SELECT SUM("incomes"."lines_price") AS sum_lines_price, date(filled_at)
AS date_filled_at FROM "incomes"
HAVING (date(filled_at) > '2012-12-04')
GROUP BY date(filled_at) ORDER BY filled_at ASC

期待される結果

[["2012-12-04", SUM_FOR_DATE], ["2012-12-05", SUM_FOR_DATE], ...]
4

3 に答える 3

6

あなたの間違いは、おそらくデフォルトのスコープで、filled_atを順番に使用することでした。

unscopedを使用して修正し、デフォルトのスコープを削除できます。

Income.unscoped
 .group('date(filled_at)')
 .having("date(filled_at) > ?", Date.today - n)
 .sum(:lines_price)

また

Income.unscoped
   .group('date(filled_at)')
   .having("date(filled_at) > ?", Date.today - n)
   .sum(:lines_price)
   .order('date(filled_at) ASC')

でも、持っている代わりにどこで使うほうがいいと思います

Income.unscoped
  .where("date(filled_at) > TIMESTAMP ?", Date.today - n)
  .group('date(filled_at)')
  .sum(:lines_price)
  .order('date(filled_at) ASC')

SQLFiddle

2012-12-04は2012-12-0400:00:00になるため、TIMESTAMPの使用には注意する必要があります。したがって、この日を結果として使用したくない場合は、Date.today-(n-1)を使用してください。

filled_at列にインデックスを作成する場合

 create index incomes_filled_at on incomes(filled_at);

移行:

 add_index :incomes, :filled_at

このテーブルには多くのデータがあり、インデックスはフィルタリングに使用されます。したがって、クエリははるかに高速になるはずです。

したがって、両方を記述して、どちらが高速かをテストします(インデックスがない場合は、filled_atにインデックスを作成する必要があります)。

于 2012-12-18T12:56:33.270 に答える
3

date(filled_at)これは、GROUP BYで使用しているがfilled at、ORDERで使用しているためだと思います。順序はデフォルトのスコープから取得されていると思うので、それを。で上書きする必要がありますreorder。私は提案します:

Income.sum(:lines_price).
    group('date(filled_at)').
    having("date(filled_at) > ?", Date.today - n).
    reorder("date(filled_at) ASC")
于 2012-12-18T12:41:18.280 に答える
1

PostgreSQLでGroupByを使用する場合は、groupbyでselectオプションが必要です。

Income.select('filled_at').group('date(filled_at)').having("date(filled_at) > ?", Date.today - n).sum(:lines_price)
于 2013-05-20T22:32:45.757 に答える