Hi All,

I’m trying to get the sum of 3 database fields.

Instead of calling find, I’m using sum like this:

```
@itemsum = Order.sum(:item_total)
@shipsum = Order.sum(:shipping_total)
@taxsum = Order.sum(:tax_total)
```

But, would rather not make 3 database calls to do so.

I can’t find any documentation on sum as a finder, so was wondering if

anyone has a solution for getting the sum of multiple collumns this way.

The end sql result I’m trying to achieve is:

SELECT sum(tax_total) AS sum_tax_total, sum(item_total) AS

sum_item_total, sum(shipping_total) AS sum_shipping_total FROM orders

Of course I could just do a find_by_sql, but was just trying something

new.

Thanks!

Dave

afaik, there’s no special finder for collecting together three sums in

a single query. You’ll need to get your hands mildly dirty with SQL.

Javier points out easiest solution with one tweak – drop the colons:

sums = Order.find(:all, :select=>‘sum(item_total) AS item,

sum(shipping_total) AS ship, sum(tax_total) AS tax’).first

@itemsum = sums[:item]

@shipsum = sums[:ship]

@taxsum = sums[:tax]

I’m trying to get the sum of 3 database fields.

Instead of calling find, I’m using sum like this:

```
@itemsum = Order.sum(:item_total)
@shipsum = Order.sum(:shipping_total)
@taxsum = Order.sum(:tax_total)
```

But, would rather not make 3 database calls to do so.

maybe you can try

Order.find(:all,:select=>‘sum(:item_total),sum(:shipping_total),sum(:tax_total)’)

in case you need it you can also add ,group=>:my_grouping_field

regards,

javier ramirez

Estamos de estreno… si necesitas llevar el control de tus gastos

visita http://www.gastosgem.com !!Es gratis!!

afaik, there’s no special finder for collecting together three sums in

a single query. You’ll need to get your hands mildly dirty with SQL.

Javier points out easiest solution with one tweak – drop the colons:

right… lazy me… i c/pasted the fields into the sentence and i didn’t

realize i was taking the colons with me

regards

javier

## –

Estamos de estreno… si necesitas llevar el control de tus gastos

visita http://www.gastosgem.com !!Es gratis!!

Eden Li wrote:

afaik, there’s no special finder for collecting together three sums in

a single query. You’ll need to get your hands mildly dirty with SQL.

Javier points out easiest solution with one tweak – drop the colons:

sums = Order.find(:all, :select=>‘sum(item_total) AS item,

sum(shipping_total) AS ship, sum(tax_total) AS tax’).first

@itemsum = sums[:item]

@shipsum = sums[:ship]

@taxsum = sums[:tax]

So, this approach gives me an inaccurate number:

sums = Order.find(:all, :select=>‘sum(item_total) AS item,

sum(shipping_total) AS ship, sum(tax_total) AS tax’).first

@were_rich = sums[:item].to_i + sums[:ship].to_i + sums[:tax].to_i

## In this case, @were_rich = 197,018.00 (rounded because it’s a Float)

But, if I get the sum this way it’s accurate:

@sums = Order.find(:all)

@were_rich = @sums.sum(&:item_total) + @sums.sum(&:shipping_total) +

@sums.sum(&:tax_total)

Here, @were_rich = 197,018.77

So the first approach, I lost my 77 cents.

I guess the difference in the 2 approaches is that approach 1 lets mySQL

do the math were approach 2 lets Ruby do the math.

Thanks for your help!

Dave

So the first approach, I lost my 77 cents.

I guess the difference in the 2 approaches is that approach 1 lets mySQL

do the math were approach 2 lets Ruby do the math.

I think you’re losing the 77 cents because of this line:

@were_rich = sums[:item].to_i + sums[:ship].to_i + sums[:tax].to_i

Change those .to_i’s to .to_f’s.

David C. wrote:

@were_rich = sums[:item].to_i + sums[:ship].to_i + sums[:tax].to_i

In this case, @were_rich = 197,018.00 (rounded because it’s a Float)

Uhh… #to_i means “convert to integer”. You probably meant to use

#to_f?

Eden Li wrote:

David C. wrote:

@were_rich = sums[:item].to_i + sums[:ship].to_i + sums[:tax].to_i

In this case, @were_rich = 197,018.00 (rounded because it’s a Float)

Uhh… #to_i means “convert to integer”. You probably meant to use

#to_f?

works much better that way.

Thanks!

Just so you know you could try something like this also

find_by_sql(“select (item_total + shipping_total + tax_total) as

grandtotal from tablename group by id”)

this method is more efficient

David C. wrote:

Eden Li wrote:

David C. wrote:

@were_rich = sums[:item].to_i + sums[:ship].to_i + sums[:tax].to_i

In this case, @were_rich = 197,018.00 (rounded because it’s a Float)

Uhh… #to_i means “convert to integer”. You probably meant to use

#to_f?

works much better that way.

Thanks!