给出这样的发票表:
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(日期)或其他东西,具体取决于数据库服务器,sqllite是strftime('%y',invoice_date))
好的,我试图在rails / ActiveRecord中翻译它:
Invoice.count(:group => 'customer')
这有效,但我怎样才能得到计数,总和和最大值?
我熟悉的想法是(在SQL中)group by
生成行(好吧,为了正确,确定结果表中应该存在哪些行),然后传递一个任意数字聚合函数应用于单个结果行后面的每个分散行集。 E.G: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') 发票负载(0.3ms)SELECT客户,总和(总计)AS TOTAL_GROUP FROM“发票”GROUP BY客户 => [#,#]
那就是:它不会给这个字段带来总和......
答案 0 :(得分:0)
确实如此,它只是没有打印出来。
假设您的查询是i = Invoice.select('customer, sum(total) as sum_total').group('customer')
所以i
是一个包含所有结果的数组(技术上它不是数组,但在这里不重要)。所以i[0].sum_total
将为您提供第一个客户的总和,但当然您应该迭代它以获得您想要的一切。