Another DAL challenge..... accepted!
assuming the model:
db.define_table('tasks',
Field('name')
)
db.define_table('periods',
Field('task_id', db.tasks),
Field('start_time', 'datetime'),
Field('end_time', 'datetime'),
)
You'd like to calculate the total duration (let's say in seconds) of every
period, and sum that total duration by task_id. Instead of visualizing the
task_id, you want task.name.
Instead of blowing the full solution, let's take it one step at a time,
hopefully enjoying the logic that ties your goal, your brain, the database
and the DAL abstraction....
for every "period", duration is calculated as:
duration = db.periods.end_time.seconds() - db.periods.start_time.seconds()
now, get a list of all "durations"...
result = db(db.periods.id>0).select(db.periods.id, duration)
But, you want the SUM of this durations, grouped by task_id.....
let's rewrite "duration" as the SUM of it
duration = (db.periods.end_time.seconds() -
db.periods.start_time.seconds()).sum()
and the result, with task_id
result = db(db.periods.id>0).select(db.periods.task_id, durations,
groupby=db.periods.task_id)
Now, slip into it task.name instead of the id, joining the two tables....
the definition of duration remains the same
duration = (db.periods.end_time.seconds() -
db.periods.start_time.seconds()).sum()
result = db(db.periods.task_id ==
db.tasks.id).select(db.tasks.name,duration, groupby=db.tasks.name)
Everything clear ??
NB: a little caveat.... with compound expressions like sum() or this kind
of calculations, looping the results can't be done in the usual way, like:
for row in result:
print row.tasks.name, row.duration
this is going to raise an exception because duration is not a proper column
of a table....
You can use the dictionary notation to solve the "problem":
for row in result:
print row.tasks.name, row[duration]
Il giorno lunedì 19 marzo 2012 20:00:42 UTC+1, backseat ha scritto:
>
> I need to run a reasonably complex query, and I'm wondering whether it
> would be better to code it in SQL, or should I try to get the DAL to
> provide the data (or maybe there's another way). There's no right or wrong
> answer, but I'd welcome opinion on the best approach.
>
> Simply put, consider two tables, "tasks" and "periods". As well as an id
> field, tasks has a 'name' field too. Each task has multiple periods (of
> work) associated with it, and the periods table has id, date, start_time,
> end_time (and other fields). What I want to do is produce a summary that
> lists:
>
> task_name total_time
>
> ...for each task. That is, for each period, find the duration by
> subtracting the start_time from the end_time, and total all durations for
> each task in turn.
>
> I can write this in SQL, but then I lose the advantages of the DAL, as
> well as potentially losing database portability. I'm not even sure if this
> is doable in the DAL.
>
> What would be the best approach?
> --
> "You can have everything in life you want if you help enough other people
> get what they want" - Zig Ziglar.
>
> Who did you help today?
>
>