次のような請求書テーブルがあるとします。
invoice_date customer total
2012/01/01 A 780
2013/05/01 A 3800
2013/12/01 A 1500
2012/07/01 B 15
2013/03/01 B 21
私は両方が欲しいと言います:
- 毎年の各顧客の請求書の数
- 各年の各顧客のすべての請求額の合計
- 毎年の各顧客のすべての請求書の最大金額
つまり、SQL では非常に簡単です。
SELECT CUSTOMER, YEAR(invoice_date) as INVOICE_YEAR, MAX(total) AS MAX_TOTAL, SUM(total) AS SUM_AMOUNTS, count(*) AS INVOICES_NUM AS SUM_TOTAL FROM invoices GROUP BY YEAR(invoice_date), CUSTOMER;
(日付の年を抽出する関数は、データベース サーバーに応じて YEAR(date) または他のものである可能性があります。sqllite では strftime('%y', Invoice_date) です)
わかりました、これを rails/ActiveRecord で翻訳しようとしました:
Invoice.count(:group => 'customer')
これは機能しますが、カウントと合計と最大の両方を取得するにはどうすればよいですか?
私がよく知っている考え方は、(SQL では)group by
行を生成し (正確には、結果テーブルに存在する行を決定します)、次に任意の数の集計関数を渡します。単一の結果行の背後にある一連の行を分解します。EG:group by customer
意味: 顧客 A に 1 行、顧客 B に 1 行。次に、必要な集計関数の数を渡すことができます: count(*)
、max(total)
、max(date)
、min(total)
最も一般的なものをリストするだけです。
rails ActiveRecord API を見ると、グループはcount
. そして、複数の集計関数が必要な場合はmax
、sum
などですか?
2 回目の試行
irb> i = Invoice.select('customer, sum(total)').group('customer') Invoice Load (0.3ms) SELECT customer, sum(total) AS TOTAL_GROUP FROM "invoices" GROUP BY customer => [# 、#]
つまり、合計でフィールドを返しません...