C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Перекрестный отчет, Перекрестный отчет
koltaviy
Отправлено: 19.05.2006, 05:59


Не зарегистрирован







Всем привет..
Возникла следующая проблема:
1) Имеется таблица:
----------------------------------------------------
Локализация | Пол | Год рождения
----------------------------------------------------
2) Необходимо создать отчет подсчитывающий кол-во людей каждой локализации каждого пола в пределах возраста..

Отчет выглядит примерно так:
-------------------------------------------------------
--Локализация--|--Пол--|--------Возраст-----
-------------------------------| 10-20 | 20-30 |...
-------------------------------------------------------
--Локализация1-----м-------...--------...
--------------------------ж------...--------...
- — - — - — - — - — - — - — - — - — - — - — - — - — - — - -
--Локализация2-----м-------...--------...
--------------------------ж------...--------...
- — - — - — - — - — - — - — - — - — - — - — - — - — - — - -
...................................................................


Пересмотрел наиболее популярные пакеты для отчетов, такие как FastReport, VividReport, ну про Quick я и не говорю..
Не нашел ничего похожего, хотя в FastReport CrossData чо-то напоминает, но толком не разобрался.. Прочитал Help к нему, но там ничо про перекрестные не написано..
Проблема заключается не только в использовании перекрестных отчетов, но и в вычисляемых полях типа возраст(из даты рождения).. Т.е. в идеале бы было, если бы на Label можно было установить Filter или что-то типа этого..
Если я чо-то не понял и это можно сделать перечисленными мной пакетами, объясните, пожалуйста, как именно. Повторюсь — в их Help'ах по перекрестным отчетам ничо не сказано.
Если это необходимо реализовывать каким-то иным способом, может имеются типичные приемы для такой организации, подскажите, пожалуйста, как..
AVC
Отправлено: 19.05.2006, 08:12


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE

может имеются типичные приемы для такой организации

Имеются.
Обычно эта функция (подсчета внутри групп) возлагается на сервер БД. В результате получается набор строк типа
запись 1: локализация, пол, count(10-20), count(20-30, ...
запись 2:...
...
А вот эти строки уже отображаются любой системой.
Текст запроса зависит от используемой СУБД.

На а так как этот вопрос НЕ в ветке "Работа с базами данных" то, наверное, данные у вас в массивах. В этом случае все придется делать "ручками".
koltaviy
Отправлено: 19.05.2006, 13:47


Не зарегистрирован







Сорри, если пост не в своей ветке. Если это возможно — сендите его в БД.
Просто вопрос по отчетам, и я совсем не подумал, что работа с БД sad.gif
Работаю я с базами: BDE/Paradox.
Не понял, что получится за запрос!
SQL
SELECT Count(Num) WHERE Vozrast>=10 AND Vozrast<=20 AND Pol='м'

Вернет одну строку.
Извиняюсь, если это глупый вопрос, просто все FAQ'и и учебники по SQL, которые у меня есть, я уже читал. Ничо подобного там нет. Оно и понятно — FAQ'и для чайников. Ничо интересного там нет.
Как написать запрос, чтобы пришли все интересующие меня записи?
В любом случае, в запросе будут записи, в котором значение [Локализации] всегда будет определено, а мне нужно, чтобы в каждой (i+1) записи его не было — значение отражается один раз для обоих полов(в i-той записи)..
AVC
Отправлено: 19.05.2006, 14:32


Ветеран

Группа: Модератор
Сообщений: 1583



Парадокс — это файловая БД и нормального запроса "не потянет"

"Нормальные" запросы можно написать так:
схема запроса, вариант 1
CODE

Select локализация, пол
,sum(if(в_группе_1, 1, 0)) as cnt1
,sum(if(в_группе_2, 1, 0)) as cnt2
...
,sum(if(в_группе_N, 1, 0)) as cntN
From ...
Group by локализация, пол


Вариант 2
CODE

Select локализация, пол, sum(cnt1), sum(cnt2) ... sum(cntN)
From
(Select локализация, пол, count(*) as cnt1, 0 as cnt2 ... 0 as cntN
 From ... Where в_группе_1 Group by локализация, пол
 Union all
 Select локализация, пол, 0, count(*) ... 0
 From ... Where в_группе_2 Group by локализация, пол
 ...
 Union all
 Select локализация, пол, 0, 0 ... count(*)
 From ... Where в_группе_N Group by локализация, пол
)


Ну а для парадокса, я думаю, проще всего будет создать дополнительную таблицу и заполнить её простым проходом по основной таблице (ручной способ варианта 1)
koltaviy
Отправлено: 21.05.2006, 13:27


Ученик-кочегар

Группа: Участник
Сообщений: 1



Спасибо!

Вернуться в Работа с базами данных в C++Builder