On Tuesday, March 27, 2012 6:25:16 PM UTC-4, go94025 wrote:
>
> Hi - new to Web2py and the group. I'm building an app that will need to
> perform Sum and Max against large sets of data. As I'm getting familiar
> with the DAL, I've tried the following (and other combinations) rather than
> fall back to db.executesql.
>
> I'm getting the correct result but can't figure out a way to get only the
> result number (68) without the (SUM(rates.val02). Probably missing
> something basic but I've tried a lot of combinations and can't seem to get
> there.
>
> Thanks in advance.
>
> Model-
> db.define_table('rates',
> Field('rate_name', 'string'),
> Field('val01', 'integer'),
> Field('val02', 'integer'),
>
> Controller-
> def sum1():
> query = db.rates.val02.sum()
> return dict(sum1 = db().select(query))
>
> View-
> {{=sum1}}
>
> Result-
> SUM(rates.val02)68
>
The key for the sum is the serialized SQL generated by the DAL, which is
"SUM(rates.val02)" (note, technically it is adapter-specific). However, you
can use the original object as the key, and it will be serialized to the
actual key for you. So, just do:
return dict(sum1 = db().select(query).first(), query=query)
and in the view:
{{=sum1[query]}}
That is equivalent to:
{{=sum1[str(query)]}}
which is equivalent to:
{{=sum1['SUM(rates.val02)']}}
Note, I changed sum1 to call the .first() method, which extracts the first
(and only) row from the Rows object.
Anthony