Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Сгруппировать элементы массива хэшей


Автор: pirojok 22.6.2010, 08:58
Делаю выборку из БД:
Код

my $result=$sql_request->execute || die "Error while to execute the $sql";
while(my %RESULT=%{$sql_request->fetchrow_hashref})
                                {
                                push @out,\%RESULT;
                                }


на выходе имеем:
komanda     user      inc
______________________
com1           user1    inc1
com2           user3    inc2
com3           user1    inc3
com1           user1    inc4
com2           user3    inc5
com2           user3    inc6
com3           user1    inc7

Эти данные необходимо сгруппировать по полям komanda  и user (аналогично group by komanda,user  в SQL).
Получив,например массив хэшей вида:
komanda     user     count
______________________
com1            user1    2
com2            user3    3
и т.д.

Как это реализовать средствами perl ?
П.С. сделать группировку средствами ORACLE не удалось.

Автор: dva300 22.6.2010, 14:31
Цитата(pirojok @ 22.6.2010,  08:58)
Делаю выборку из БД:
Код

my $result=$sql_request->execute || die "Error while to execute the $sql";
while(my %RESULT=%{$sql_request->fetchrow_hashref})
                                {
                                push @out,\%RESULT;
                                }


на выходе имеем:
komanda     user      inc
______________________
com1           user1    inc1
com2           user3    inc2
com3           user1    inc3
com1           user1    inc4
com2           user3    inc5
com2           user3    inc6
com3           user1    inc7

Эти данные необходимо сгруппировать по полям komanda  и user (аналогично group by komanda,user  в SQL).
Получив,например массив хэшей вида:
komanda     user     count
______________________
com1            user1    2
com2            user3    3
и т.д.

Как это реализовать средствами perl ?
П.С. сделать группировку средствами ORACLE не удалось.

привет, 
что то мне не вериться в oracle это нельзя сделать sql-ем.

см мой пример. может поможет. 
1) обрати внимание на обработку ошибки execute 
2) зачем нужен fetchrow_hashref я не совсем понял.

пример не проверял потому так как нет возможности сейчас. возможно есть ошибки но логика должна быть верной.

Код

my %hash;

my $res = db->prepare("SElECT * FROM bd_name");
$res->execute();
if ($res->err)
    {
    print "Ошибка ". $res->errstr;
    }
else
    {
    while (my @row = $res->fetchrow_array())
        {
        if (exists($hash{$row[0]}))
            {
            $hash{$row[0]}->[1] = $hash{$row[0]}->[1] + 1;
            }
        else
            {
            $hash{$row[0]}->[0] = $row[1];
            $hash{$row[0]}->[1] = 1;
            }
        }
    }    

# Вывод
foreach my $key (sort(keys(%hash)))
    {
    print "$key => ";
        for (my $i=0; $i<@{$hash{$key}};$i++)
            {
            print "$hash{$key}->[$i]";
            }
        print "\n";
    }


P.S. а SQL попробуй такой SELECT komanda,max(user),count(inc) from table group by komanda

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)