my %features; my %plans; my %feat_plan_val; while ( my ( $feat_id, $feat_name, $plan_id, $plan_name, $val ) = $sth->fetchrow_array() ) { $features{$feat_id} = $feature_name; $plans{$plan_id} = $plan_name; $feat_plan_val{$feat_id}{$plan_id} = $val; } # later... my @plan_ids = sort keys %plans; print join( "\t", 'Features', @plans{@plan_ids} ), "\n"; foreach my $feat_id ( sort keys %features ) { my @vals = ( $features{$feat_id} ); foreach my $plan_id ( @plan_ids ) { my $val = $feat_plan_val{$feat_id}{$plan_id}; push @vals, ( defined $val ? $val : '-' ); } print join( "\t", @vals ), "\n"; }