![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Трансформация таблицы [D7, FireBird]
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]Впрочем можно поизвращаться в хранимой процедуре, но овчинка выделки не стоит.