sql - understanding group by statements in rails -


given invoices table this:

invoice_date   customer        total          2012/01/01                   780                  2013/05/01                  3800  2013/12/01                  1500  2012/07/01       b              15  2013/03/01       b              21 

say want both:

  1. the count of invoices of each customer of each year
  2. the sum of amounts of invoices of each customer of each year
  3. the max amount among invoices of each customer of each year

that is, in sql, easily:

select customer, year(invoice_date) invoice_year, max(total) max_total, sum(total) sum_amounts, count(*) invoices_num sum_total invoices group year(invoice_date), customer; 

(the function extract year of date may year(date) or else depending on database server, on sqllite strftime('%y', invoice_date))

ok, i've tryed translate in rails/activerecord:

invoice.count(:group => 'customer') 

this works, how can both count , sum , max?

the idea i'm familiar (in sql) group by generates rows (well, correct, determines rows should exist in result table), , pass arbitrary number of aggregation functions applyed on every disaggregate set of rows behind single result row. e.g: group customer means: 1 row customer a, 1 row customer b; can pass how many aggregation function want: count(*), max(total), max(date), min(total) list common.

looking @ rails activerecord api seems you're supposed 1 function @ time, because group argument of count. , if want multiple aggregation functions, max, sum etc?

second attempt

irb> = invoice.select('customer, sum(total)').group('customer') invoice load (0.3ms) select customer, sum(total) total_group "invoices" group customer => [#, #]

that is: doesn't give field sum...

well does, doesn't printed out. query i = invoice.select('customer, sum(total) sum_total').group('customer')

so i array(technically it's not array, not important here) containing result. i[0].sum_total give sum of first customer, of course should iterate want.


Comments

Popular posts from this blog

javascript - Count length of each class -

What design pattern is this code in Javascript? -

hadoop - Restrict secondarynamenode to be installed and run on any other node in the cluster -