给定这样的发票表:
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 中)agroup by
生成行(好吧,是正确的,确定结果表中应该存在哪些行),然后传递任意数量的聚合函数,这些函数应用于每个分解单个结果行后面的行集。EG:group by customer
表示:客户A一排,客户B一排;然后我可以传递我想要多少个聚合函数:count(*)
, max(total)
, max(date)
,min(total)
只是列出最常见的。
查看 rails ActiveRecord API,您似乎应该一次只执行一个函数,因为该组是count
. 如果我想要多个聚合函数,比如max
等等sum
?
第二次尝试
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 => [# , #]
那就是:它不会返回带有总和的字段......