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 中)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 => [# , #]

那就是:它不会返回带有总和的字段......

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 回答