Forum Webscript.Ru
Программирование => Perl => Тема начата: 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
Спасибо.
-
Вот что у меня получилось
#!/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\' в запросе.
-
Если не нужно выводить количество по каждой фамилии то суммы по фамилиям искать можно с помощью всего одного запроса, в котором нужны GROUP BY и SUM! А если нужно и то и другое, просто сделать два запроса... Вообще я не сторонник перекладывания на Язык программирования того, что можно сделать с помощью SQL и Вам советую!
-
KiLLjoY aka SerZH:
Вообще я не сторонник перекладывания на Язык программирования того, что можно сделать с помощью SQL и Вам советую!
Всё зависит от задачи, а придерживание только определённых правил не всегда оправданно!
-
vladsu:
Вот что у меня получилось...
Если же понадобится в отсортированном виде, то добавьте \'sort\' перед \'keys\', и не используйте \'order by\' в запросе.
Спасибо! Обязательно попробую.
А почему \'order by\' не использовать в запросе? Занимает больше ресурсов чем \'keys\'? Просто я тоже думаю, что если можно использовать эту фишку в запросе, нечего ее перекладывать на Язык программирования.
KiLLjoY aka SerZH:
с помощью всего одного запроса, в котором нужны GROUP BY и SUM!
Ага! тоже думал об этом... спасибо.
-
Сорри! Скажите, а каким образом тогда вывести сумму по сгруппированным Фамилиям?
$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();
-
vladsu:
Вот что у меня получилось
ОФИГЕННО получилось!!! :)
Спасибо! То, что и просил... Биру-Бир!!! :)
З.Ы. Еще бы хотелось в предыдущем примере разобраться ;) ... я про вывод суммы.
-
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";
}
-
vladsu, спасибо