Автор Тема: Результат выборки из БД: уникальность и подсчет  (Прочитано 5552 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн DamonLSD

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 53
  • +0/-0
  • 0
    • Просмотр профиля
Добрый день, Уважаемый 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


Спасибо.
Good Luck,
   Damon LSD.

Оффлайн vladsu

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 271
  • +0/-0
  • 0
    • Просмотр профиля
    • http://vladislavsurguchev.eu/
Результат выборки из БД: уникальность и подсчет
« Ответ #1 : 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\' в запросе.
« Последнее редактирование: 01 Сентября 2006, 23:43:26 от vladsu »
----------------------------------------------
Мой сайт чёрно-белых фотографий из разных уголков мира тут

Оффлайн KiLLjoY aka SerZH

  • Завсегдатай
  • Новичок
  • *
  • Сообщений: 45
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Результат выборки из БД: уникальность и подсчет
« Ответ #2 : 03 Сентября 2006, 00:21:55 »
Если не нужно выводить количество  по каждой фамилии то суммы по фамилиям искать можно с помощью всего одного запроса,  в котором нужны GROUP BY и SUM! А если нужно и то и другое, просто сделать два запроса... Вообще я не сторонник перекладывания на Язык программирования того, что можно сделать с помощью SQL и Вам советую!

Оффлайн vladsu

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 271
  • +0/-0
  • 0
    • Просмотр профиля
    • http://vladislavsurguchev.eu/
Результат выборки из БД: уникальность и подсчет
« Ответ #3 : 03 Сентября 2006, 19:34:26 »
Цитировать
KiLLjoY aka SerZH:
Вообще я не сторонник перекладывания на Язык программирования того, что можно сделать с помощью SQL и Вам советую!

Всё зависит от задачи, а придерживание только определённых  правил не всегда оправданно!
----------------------------------------------
Мой сайт чёрно-белых фотографий из разных уголков мира тут

Оффлайн DamonLSD

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 53
  • +0/-0
  • 0
    • Просмотр профиля
Результат выборки из БД: уникальность и подсчет
« Ответ #4 : 04 Сентября 2006, 08:37:26 »
Цитировать
vladsu:
Вот что у меня получилось...
Если же понадобится в отсортированном виде, то добавьте \'sort\' перед \'keys\', и не используйте \'order by\' в запросе.

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

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

Ага! тоже думал об этом... спасибо.
Good Luck,
   Damon LSD.

Оффлайн DamonLSD

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 53
  • +0/-0
  • 0
    • Просмотр профиля
Результат выборки из БД: уникальность и подсчет
« Ответ #5 : 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();
Good Luck,
   Damon LSD.

Оффлайн DamonLSD

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 53
  • +0/-0
  • 0
    • Просмотр профиля
Результат выборки из БД: уникальность и подсчет
« Ответ #6 : 04 Сентября 2006, 11:25:49 »
Цитировать
vladsu:
Вот что у меня получилось

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

З.Ы. Еще бы хотелось в предыдущем примере разобраться ;) ... я про вывод суммы.
Good Luck,
   Damon LSD.

Оффлайн vladsu

  • Фанат форума
  • Старожил
  • ****
  • Сообщений: 271
  • +0/-0
  • 0
    • Просмотр профиля
    • http://vladislavsurguchev.eu/
Результат выборки из БД: уникальность и подсчет
« Ответ #7 : 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

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 53
  • +0/-0
  • 0
    • Просмотр профиля
Результат выборки из БД: уникальность и подсчет
« Ответ #8 : 05 Сентября 2006, 16:43:05 »
vladsu, спасибо
Good Luck,
   Damon LSD.

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28