my $query = qq{ SELECT 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 tm ORDER BY tm }; my $averages = $dbh->selectall_arrayref($query) or die $DBI::errstr; printf "%-15s %5.2f\n", @$_ for @$averages; __END__ output: 1 morning 120.33 2 afternoon 117.00 3 evening 171.00