#!/usr/bin/perl -w use strict; use DBI; my @data = ( ['2004-02-01 07:01', 82], ['2004-02-01 11:38', 172], ['2004-02-01 22:48', 154], ['2004-02-02 05:38', 107], ['2004-02-02 13:20', 117], ['2004-02-02 23:48', 188]); my $dbh = DBI->connect("dbi:SQLite:averages","","") or die $DBI::errstr; unless ( -s "averages") { $dbh->do(qq{ CREATE TABLE averages ( d datetime not null, val INTEGER)}) or die $DBI::errstr; for (@data) { $dbh->do( qq{INSERT INTO averages VALUES (?, ?)}, undef, @$_) or die $DBI::errstr } } my $query = qq{ SELECT substr(d,1,10) as day, CASE WHEN substr(d,12,2) BETWEEN 4 AND 12 THEN "1 morning" WHEN substr(d,12,2) BETWEEN 13 AND 18 THEN "2 afternoon" WHEN substr(d,12,2) BETWEEN 19 AND 24 THEN "3 evening" ELSE "4 night" END AS tm, AVG(val) FROM averages GROUP BY day, tm ORDER BY day, tm }; my $averages = $dbh->selectall_arrayref($query) or die $DBI::errstr; printf "%-10s %-15s %5.2f\n", @$_ for @$averages; __END__ output: 2004-02-01 1 morning 127.00 2004-02-01 3 evening 154.00 2004-02-02 1 morning 107.00 2004-02-02 2 afternoon 117.00 2004-02-02 3 evening 188.00