1

次のような請求書テーブルがあるとします。

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

私は両方が欲しいと言います:

  1. 毎年の各顧客の請求書の数
  2. 各年の各顧客のすべての請求額の合計
  3. 毎年の各顧客のすべての請求書の最大金額

つまり、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. そして、複数の集計関数が必要な場合はmaxsumなどですか?

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 => [# 、#]

つまり、合計でフィールドを返しません...

4

1 に答える 1

0

そうですね、印刷されないだけです。クエリがi = Invoice.select('customer, sum(total) as sum_total').group('customer')

すべての結果を含む配列 (技術的には配列ではありませんが、ここiでは重要ではありません) も同様です。したがってi[0].sum_total、最初の顧客の合計が得られますが、もちろん、必要なものをすべて取得するには反復する必要があります。

于 2013-07-11T10:30:50.810 に答える