通过rails中的语句理解group

时间:2013-07-10 22:43:38

标签: sql ruby-on-rails activerecord group-by

给出这样的发票表:

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. 每年每位客户的所有发票中的最高金额
  4. 也就是说,在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的参数。如果我想要多个聚合函数,请说maxsum等?

    第二次尝试

    IRB> i = Invoice.select('customer,sum(total)')。group('customer')   发票负载(0.3ms)SELECT客户,总和(总计)AS TOTAL_GROUP FROM“发票”GROUP BY客户 => [#,#]

    那就是:它不会给这个字段带来总和......

1 个答案:

答案 0 :(得分:0)

确实如此,它只是没有打印出来。 假设您的查询是i = Invoice.select('customer, sum(total) as sum_total').group('customer')

所以i是一个包含所有结果的数组(技术上它不是数组,但在这里不重要)。所以i[0].sum_total将为您提供第一个客户的总和,但当然您应该迭代它以获得您想要的一切。