in reply to Improve this "group by" perl sub

seblec:

To be honest, I would normally do it in the SQL, letting it do the grunt work of grouping the data, finding the max and sum:

select category||type as grp, max(category) as cat, max(type) as typ, sum(quantity) as qty from table group by category || type

On the perl side, I think you're trying to make rowsGroupBy too "smart". Rather than doing one task well, you're trying to make it a jack-of-all trades. I would think that a simple function that would return a list of records with the group-by keys would be a single function I'd use, something like:

sub group_by { my ($rows, $group_keys) = @_; my @recs=(); for my $row (@$rows) { push @recs, { GRP=>join(chr(28),@{$row}{@$group_keys}), %$row }; } return @recs; }

Similarly, you could write other single-purpose functions to handle MAX and SUM, or use functions from List::Util and List::MoreUtils to do the other jobs.

...roboticus

When your only tool is a hammer, all problems look like your thumb.