Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Трансформация таблицы [D7, FireBird]


Страницы:   1 2 3

VitalikS ©   (2006-08-03 06:40:00) 

Можно ли как-нибудь SQL запросом трансформировать таблицу (т.е. чтобы строки стали столбцами)?


Sergey13   (2006-08-03 14:27:00) [21]

> [20] Dok   (03.08.06 14:21)

ОЛАП и расчитывает, но, насколько я знаю, данные в нем лежат не так, как в "боевом" сервере, а "несколько" иначе - более денормализовано для скорости расчетов. Так что это уже получается некий симбиоз сервера БД и приложений.


Dok   (2006-08-03 14:21:00) [22]


> Да, только он имеет мало общего с "боевой" БД.

и?
кто расчитывает?


Sergey13   (2006-08-03 14:17:00) [23]

> [18] Dok   (03.08.06 14:11)

Да, только он имеет мало общего с "боевой" БД.


Dok   (2006-08-03 14:11:00) [24]


> ОЛАП-а выделяется свой сервер БД.

вот именно, не сервер приложения - а сервер СУБД.


Desdechado   (2006-08-03 14:09:00) [25]

Dok   (03.08.06 13:58) [15]
Спорить не буду.
Обычно трактуется так: задача СУБД - хранить. Задача сервера приложений - обрабатывать. OLAP - это массовая обработка, поэтому грузить ей сервер БД негуманно.


Sergey13   (2006-08-03 14:05:00) [26]

Насколько я понимаю (я ОЛАП-ом не занимался, просто читал/слышал) для ОЛАП-а выделяется свой сервер БД.


Dok   (2006-08-03 13:58:00) [27]


> Согласно новым веяниям - сервер приложений, а не сервер
> БД.

С чего-бы это серверу приложения заниматься расчетом OLAP? Только сервер БД !


Desdechado   (2006-08-03 13:56:00) [28]

> OLAP), то такие весчи однозначно(!) должен делать сервер.
Согласно новым веяниям - сервер приложений, а не сервер БД.


Dok   (2006-08-03 13:54:00) [29]


> А НЕ для отчета? ОТОБРАЖЕНИЕМ данных, ИМХО, по любому должен
> клиент заниматься

Я и не спорю что отображением данных должен клиент заниматься, я говорю что для Отчета - клиент. Если допустим афтор хотел как-то для расчетов заюзать(OLAP), то такие весчи однозначно(!) должен делать сервер.


atruhin   (2006-08-03 12:57:00) [30]

А как скомпилированный 300 лет назад exe-шник, будет искать, создавать и вызывать твои непонятные процедуры.
Мы вроде говорим о написании программы, а не о изменении exe файла!
Если на то пошло, то в начале поста я предложил более коррекное решение, возможно на 1-2 секунды медленнее (время компиляции запроса), но для вызова раз в месяц самое то.


PEAKTOP   (2006-08-03 12:36:00) [31]


> Desdechado ©   (03.08.06 10:49) [7]
> Главная "гадость" в том, что в случае многопользовательской работы создание на лету процедур - плохая практика, чреватая конфликтами и сбоями.
>

Согласен. Может и база "с катушек съехать". Но если какой-то отчет смотрит только директор или глав-бух раз в месяц, то можно рискнуть...


> atruhin ©   (03.08.06 11:23) [10]
>
> > Преимущества этого способа вижу в том, что позволяет "запихнуть"
> > кросс-табы в TDBChart
>
> Хороши преимущества! Если же тебе нужен потомок датасета, то проще на клиенте заполнить любой клиентский датасет.
>

Зашибись, а я бы не додумался. Только вот как запихнуть потомок от TDataSet, который "развернет" кросс-таб, в скомпиленный кем-то 300 лет назад exe-шник, который нужно сопровождать. Исходников нет, автор скорее всего уже где-то в Германии.


atruhin   (2006-08-03 11:23:00) [32]

В Firebird 2 можно, с помощью EXECUTE BLOCK. Тем более финальный релиз должен быть в ближайшие месяц, два.
Но я бы предпочел сделать это на клиенте. Как вариант для большей гибкости неплох
> [5] Danilka ©   (03.08.06 09:16)
, или например возврат строк, где значения ячеек через разделитель.

> Преимущества этого способа вижу в том, что позволяет "запихнуть"
> кросс-табы в TDBChart

Хороши преимущества! Если же тебе нужен потомок датасета, то проще на клиенте заполнить любой клиентский датасет.


Sergey13   (2006-08-03 11:13:00) [33]

> [8] Dok   (03.08.06 11:09)

А НЕ для отчета? ОТОБРАЖЕНИЕМ данных, ИМХО, по любому должен клиент заниматься.


Dok   (2006-08-03 11:09:00) [34]


> Разворот данных лучше делать на клиенте.

Если автору надо для отчета - это самый правильный совет.


Desdechado   (2006-08-03 10:49:00) [35]

PEAKTOP ©   (03.08.06 09:42) [6]
Главная "гадость" в том, что в случае многопользовательской работы создание на лету процедур - плохая практика, чреватая конфликтами и сбоями.

Разворот данных лучше делать на клиенте.
SQL требует явного указания возвращаемых полей (т.е. их число известно), а в случае разворота число строк произвольное, поэтому SQL таких возможностей не предоставляет.


PEAKTOP   (2006-08-03 09:42:00) [36]

Можно сделать процедуру с переменным числом столбцов через EXECUTE STATEMENT, благо он разрешает не только select. Для этого
1) выделить период во времени, в течение которого будут актуальны данные. Например, для той же шахматки - один месяц, квартал. Сформулировать правило имен хранимых процедур, для того, чтобы для одного периода времени была только одно процедура (ну, не будем же мы их "плодить" до бесконечности :))), например, create procedure proc$shahmatka_200606, proc$shahmatka_200607, proc$shahmatka_200608 и т.д.
2) создать процедуру PROC_CHECK(q_date timestamp), которая будет проверять, существует ли процедура для периода, в котором находится дата, формировать скрипт create or alter procedure для этого отчетно периода, в котром будет переменное число столбцов в зависимости от результатов кросс-таб запроса. Ну, и соответственно выполнять запрос, создающий/изменяющий хранимую процедуру.
3) на клиенте запускаем
 if  ExecSQL('execute procedure proce_check('''+FormatDateTime('dd.mm.yyyy', Now)+''') ') then
   begin
   IBQuery.SQL.Text := 'select * from proc$shahmatka_'+FormatDateTime('yyyymm', Now);
   if not IBQuery.Active then
     IBQuery.Open;
   ......
   end

Преимущества этого способа вижу в том, что позволяет "запихнуть" кросс-табы в TDBChart, особенно, когда требуется сравнительные динамики продаж по филиалам, а, скажем, в январе одного из филиалов и в помине еще не было.
Недостатки вижу в том, что все-таки эта гадость "плодит" в базе данных процедуры, что в общем-то с точки зрения теории не очень хорошо.


Danilka   (2006-08-03 09:16:00) [37]

я чаще всего встречался со случаями, когда и количество строк и количество столбцов динамическое. то-есть, как ни верти, все одно не угадаешь. :)
та-же шахматка, или какие-то показатели в строках, а в столбцах месяца.
обычно, делал запрос, который возвращает набор данных из 3-х полей: строка, столбец и значение показателя.
например: наименование показателя, название месяца и сумма.
а на клиенте уже формировал либо в экселе, либо в html отчет.


sniknik   (2006-08-03 09:03:00) [38]

> Экзотическая, надо сказать, задача.
не совсем, "шахматка" в бугалтерском деле повседневная вещь... правда там обычно не просто таблицу разворачивают, а итог запроса чтонибудь считающего суммы по месяцам например, так им удобнее говорят.


StriderMan   (2006-08-03 08:54:00) [39]


> VitalikS   (03.08.06 06:40)  
> Можно ли как-нибудь SQL запросом трансформировать таблицу
> (т.е. чтобы строки стали столбцами)?

это наверное называется транспонировать. Как матрицу :). Экзотическая, надо сказать, задача. А зачем это, если не секрет?


Сергей М.   (2006-08-03 08:43:00) [40]

Впрочем можно поизвращаться в хранимой процедуре, но овчинка выделки не стоит.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо