Forum Webscript.Ru

Программирование => Perl => Тема начата: DamonLSD от 01 Сентября 2006, 16:10:22

Название: Результат выборки из БД: уникальность и подсчет
Отправлено: DamonLSD от 01 Сентября 2006, 16:10:22
Добрый день, Уважаемый All :)
Давненько я тут не был. У меня снова проблемка и заключается она в следующем:
- Имеется БД (Access - mdb), юзаю я ее через Win32::ODBC. В базе, скажем так (просто пример), две колонки: "ФИО" и "Кол-во".
- С помощью запроса $sql = "SELECT * FROM db ORDER BY fio" выводится результат, в котором отображаются все записи из этой БД, отсортированные по Фамилии, например:
Иванов - 3
Иванов - 9
Иванов - 2
Сидоров - 5
Сидоров - 7
Сидоров - 1
Петров - 4
Петров - 8
и т.д.

ВОПРОС: Скажите пожалуйста, каким образом подсчитать у каждого "кол-во" и вывести нечто подобное:

Иванов - 3
Иванов - 9
Иванов - 2
-----------
        14

Сидоров - 5
Сидоров - 7
Сидоров - 1
-----------
        13

Петров - 4
Петров - 8
-----------
        12


Спасибо.
Название: Результат выборки из БД: уникальность и подсчет
Отправлено: vladsu от 01 Сентября 2006, 20:02:51
Вот что у меня получилось

#!/usr/bin/perl -w

use 5.006;

use strict;
use warnings;
#use Data::Dumper;
use DBI;

my ($schemaName, $passwd, $tableName) = qw(scott tiger t1);
my %content;

my $dbh = DBI->connect("dbi:Oracle:", $schemaName, $passwd);

%content = &getTableContent($schemaName,$tableName);

#print Dumper(\\%content);

&printOutInMyFormat( ) if %content;

$dbh->disconnect(  );

sub getTableContent {
    my ( $owner, $tabName ) = @_;
    my %content;

    my $sql = qq{ SELECT name,col
                    FROM $owner.$tabName
                };

    my $sth = $dbh->prepare($sql);
       $sth->execute(  );

    while ( @_ = $sth->fetchrow_array ) {
            push @{$content{$_[0]}},$_[1];
    }
    return %content;
}

sub printOutInMyFormat {
   
    foreach my $name( keys %content) {
        my $sum = 0;
        foreach (@{$content{$name}}) {
            print $name, \' - \', $_,"\\n";
            $sum += $_;
        }
        print \'-\' x 10,"\\n$sum\\n\\n"
    }
}


Это для Оракла, но я думаю разберётесь. Если же понадобится в отсортированном виде, то добавьте \'sort\' перед \'keys\', и не используйте \'order by\' в запросе.
Название: Результат выборки из БД: уникальность и подсчет
Отправлено: KiLLjoY aka SerZH от 03 Сентября 2006, 00:21:55
Если не нужно выводить количество  по каждой фамилии то суммы по фамилиям искать можно с помощью всего одного запроса,  в котором нужны GROUP BY и SUM! А если нужно и то и другое, просто сделать два запроса... Вообще я не сторонник перекладывания на Язык программирования того, что можно сделать с помощью SQL и Вам советую!
Название: Результат выборки из БД: уникальность и подсчет
Отправлено: vladsu от 03 Сентября 2006, 19:34:26
Цитировать
KiLLjoY aka SerZH:
Вообще я не сторонник перекладывания на Язык программирования того, что можно сделать с помощью SQL и Вам советую!

Всё зависит от задачи, а придерживание только определённых  правил не всегда оправданно!
Название: Результат выборки из БД: уникальность и подсчет
Отправлено: DamonLSD от 04 Сентября 2006, 08:37:26
Цитировать
vladsu:
Вот что у меня получилось...
Если же понадобится в отсортированном виде, то добавьте \'sort\' перед \'keys\', и не используйте \'order by\' в запросе.

Спасибо! Обязательно попробую.
А почему \'order by\' не использовать в запросе? Занимает больше ресурсов чем \'keys\'? Просто я тоже думаю, что если можно использовать эту фишку в запросе, нечего ее перекладывать на Язык программирования.

Цитировать
KiLLjoY aka SerZH:
с помощью всего одного запроса, в котором нужны GROUP BY и SUM!

Ага! тоже думал об этом... спасибо.
Название: Результат выборки из БД: уникальность и подсчет
Отправлено: DamonLSD от 04 Сентября 2006, 09:48:10
Сорри! Скажите, а каким образом тогда вывести сумму по сгруппированным Фамилиям?


$sql = "
SELECT db.naim, Sum(db.itogo) AS [Sum-itogo]
FROM db
GROUP BY db.naim
ORDER BY db.naim;
";

$dbh->Sql($sql);

while ($dbh -> FetchRow()){
%h = $dbh -> DataHash();

$count++;

print "$count - $h{naim} - ????
";
}

$dbh->Close();
Название: Результат выборки из БД: уникальность и подсчет
Отправлено: DamonLSD от 04 Сентября 2006, 11:25:49
Цитировать
vladsu:
Вот что у меня получилось

ОФИГЕННО получилось!!! :)
Спасибо! То, что и просил... Биру-Бир!!! :)

З.Ы. Еще бы хотелось в предыдущем примере разобраться ;) ... я про вывод суммы.
Название: Результат выборки из БД: уникальность и подсчет
Отправлено: vladsu от 04 Сентября 2006, 17:12:00
Цитировать
DamonLSD:
А почему \'order by\' не использовать в запросе? Занимает больше ресурсов чем \'keys\'?

В таком случае не \'keys\' а \'sort\', просто потому, что в своем решении я складываю в хеш, а в хеше, как известно, все хранится не в отсортированном виде.

Цитировать
DamonLSD:
Скажите, а каким образом тогда вывести сумму по сгруппированным Фамилиям?

Замените Ваш \'мусор\' на что-то типа:

my $sql = qq{ SELECT db.naim, Sum(db.itogo)
                          FROM db
                          GROUP BY db.naim
                          ORDER BY db.naim
                         };

    my $sth = $dbh->prepare($sql);
           $sth->execute(  );

    while ( @_ = $sth->fetchrow_array ) {
                 print "$_[0]  = > $_[1]\\n";
    }
Название: Результат выборки из БД: уникальность и подсчет
Отправлено: DamonLSD от 05 Сентября 2006, 16:43:05
vladsu, спасибо