powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Аналог PIVOT или как можно расписать данные
25 сообщений из 34, страница 1 из 2
Аналог PIVOT или как можно расписать данные
    #39144196
Dozent
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все добрый день, попытаюсь на словах изложить проблему с которой столкнулся.
Использую Firebird 2.5 много нового узнал,кое чему научился. Но вот столкнулся с проблемой вывода данных в нужном мне формате.

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

id_d, name, id_i, count_items
1 , ffff, null, 1
1, null, 2, 1
1, null, 3, 4
2, dddd, null, 2
2, null, 2, 3
2, null, 1, 5

Мне же нужно вывести ту таблицу в другом ввиде: чтобы название детализаций попали в названия колонок и по каждой пробежаться, при этом выводился список итемов которые входят в эти детализации

id_i, ffff, dddd, summ
1, 0, 5, 5
2, 1, 3, 4
3, 3, 0, 4


Вообщем, что-то на подобии отчёта. Почитав немного интернет, нащёл функцию в МС СУЛ PIVOT, но такого нет в ФБ. Какой у меня тут может быть выход? Прошу помощи...
...
Рейтинг: 0 / 0
Аналог PIVOT или как можно расписать данные
    #39144197
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DozentВообщем, что-то на подобии отчёта.
"Коли нужен чёрт, так и иди к чёрту." (с) НВГ

Почти любой отчётник умеет выводить cross-tab АКА шахматка.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Аналог PIVOT или как можно расписать данные
    #39144198
Dozent
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
с Delphi XE8 идет такой?))
...
Рейтинг: 0 / 0
Аналог PIVOT или как можно расписать данные
    #39144234
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dozentс Delphi XE8 идет такой?))
https://www.embarcadero.com/ru/products/rad-studio/fastreport
...
Рейтинг: 0 / 0
Аналог PIVOT или как можно расписать данные
    #39144395
Dozent
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
он функционален? По нему покликать можно?
...
Рейтинг: 0 / 0
Аналог PIVOT или как можно расписать данные
    #39144424
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dozent,

К нему демки идут - посмотри для начала.
...
Рейтинг: 0 / 0
Аналог PIVOT или как можно расписать данные
    #39145241
Dozent
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не могу найти, подскажите где демки искать?
...
Рейтинг: 0 / 0
Аналог PIVOT или как можно расписать данные
    #39145273
Dozent
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Папка с демками пустая C:\Program Files (x86)\FastReports\Demos
...
Рейтинг: 0 / 0
Аналог PIVOT или как можно расписать данные
    #39145304
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello, Dozent!
You wrote on 12 января 2016 г. 11:57:08:

Dozent> Папка с демками пустая C:\Program Files (x86)\FastReports\Demos
пиши в службу поддержки.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Аналог PIVOT или как можно расписать данные
    #39145897
zeon11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dozent,

Если надо на сервере, то как вариант создай временную таблицу
Код: sql
1.
2.
CREATE GLOBAL TEMPORARY TABLE TMP_PIVOT (
..............) ON COMMIT PRESERVE ROWS;


заполняй её в процедуре, потом простым селектом из неё вытягивай на клиента.
...
Рейтинг: 0 / 0
Аналог PIVOT или как можно расписать данные
    #39146057
RADSeatle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Попробуйте сначало селект формировать потом этот селект вызвать
Пример

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
with tmp1(MyFieldName) as
(select distinct t1.name)
 from table1 t1),
 tmp2(MyPivotSource) as
(select 'iif(t1.name) = '''||MyFieldName||''', t1.id_i, 0) as "'||MyFieldName||'"'
 from tmp1)
select 'select '||list(MyPivotSource)||'from table1 t2 
left join table1 t1 on t2.Table1ID = t1.id'
from rdb$database
cross join tmp2
...
Рейтинг: 0 / 0
Аналог PIVOT или как можно расписать данные
    #39148866
Dozent
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не получается чо то этот запрос
...
Рейтинг: 0 / 0
Аналог PIVOT или как можно расписать данные
    #39149032
Евгений Килин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dozent,

Как вариант в IBE есть Data Analysis.
Описываешь куб:
1. Два измерения: name, id_i.
2. Одну меру: summ.
Ну и строишь запрос по этому кубу: name в колонки, id_i в строки.
...
Рейтинг: 0 / 0
Аналог PIVOT или как можно расписать данные
    #39149039
Евгений Килин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dozent,

Да, если вдруг мой совет полезен, то подробности где-то здесь:
[spoiler]
YouTube Video
...
Рейтинг: 0 / 0
Аналог PIVOT или как можно расписать данные
    #39149461
AndreyTarasov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dozent,

Я разворачиваю таблицы через EXECUTE BLOCK, правда с именами колонок приходится мутить, но это мелочь
...
Рейтинг: 0 / 0
Аналог PIVOT или как можно расписать данные
    #39151124
dedRasta
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AndreyTarasov,
вчера как раз пришлось срочно заниматься чем-то подобным.
Получилось что-то типа этого (хотя в доках предупреждают, что этого лучше не делать):
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
execute block 
as
declare variable y integer;
declare variable stmt varchar(255);
begin
  for select distinct
    f_tab.year_rep
  from f_tab
  order by f_tab.year_rep
  into
  :y
  do begin 
    stmt = 'alter table gtt_rep add "'
    || cast( y as varchar(4))
    || '" float default 0';
    execute statement stmt;
  end
end
...
Рейтинг: 0 / 0
Аналог PIVOT или как можно расписать данные
    #39151329
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dedRastaв доках предупреждают, что этого лучше не делатьТак точно, там обрыв. в многопользовательской среде гарантированы не то только грабли, но и вилы.
...
Рейтинг: 0 / 0
Аналог PIVOT или как можно расписать данные
    #39151510
RADSeatle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dozentне получается чо то этот запрос
Вот попробуйте стандартная демо база Employee внем есть таблица департамент
1) Формируем селект или напишите процедуру который возвращает текст varchar(4000)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
with tmp1(MyFieldName) as
(select distinct t1.department
 from department t1),
 tmp2(MyPivotSource) as
(select 'sum(decode(t1.department,'''||MyFieldName||''', (t1.budget), 0)) as "'||MyFieldName||'"'
 from tmp1)
select 'select '||list(MyPivotSource)||' ,sum((t1.budget)) Total from department t1'
from rdb$database
cross join tmp2


2) Этот селект передаем query.sql.text:
Примерно формирует так и все
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
select sum(decode(T1.DEPARTMENT, 'Consumer Electronics Div.',
       (T1.BUDGET), 0)) as "Consumer Electronics Div.", sum(decode(T1.DEPARTMENT, 'Corporate Headquarters',
       (T1.BUDGET), 0)) as "Corporate Headquarters", sum(decode(T1.DEPARTMENT, 'Customer Services',
       (T1.BUDGET), 0)) as "Customer Services", sum(decode(T1.DEPARTMENT, 'Customer Support',
       (T1.BUDGET), 0)) as "Customer Support", sum(decode(T1.DEPARTMENT, 'Engineering',
       (T1.BUDGET), 0)) as "Engineering", sum(decode(T1.DEPARTMENT, 'European Headquarters',
       (T1.BUDGET), 0)) as "European Headquarters", sum(decode(T1.DEPARTMENT, 'Field Office: Canada',
       (T1.BUDGET), 0)) as "Field Office: Canada", sum(decode(T1.DEPARTMENT, 'Field Office: East Coast',
       (T1.BUDGET), 0)) as "Field Office: East Coast", sum(decode(T1.DEPARTMENT, 'Field Office: France',
       (T1.BUDGET), 0)) as "Field Office: France", sum(decode(T1.DEPARTMENT, 'Field Office: Italy',
       (T1.BUDGET), 0)) as "Field Office: Italy", sum(decode(T1.DEPARTMENT, 'Field Office: Japan',
       (T1.BUDGET), 0)) as "Field Office: Japan", sum(decode(T1.DEPARTMENT, 'Field Office: Singapore',
       (T1.BUDGET), 0)) as "Field Office: Singapore", sum(decode(T1.DEPARTMENT, 'Field Office: Switzerland',
       (T1.BUDGET), 0)) as "Field Office: Switzerland", sum(decode(T1.DEPARTMENT, 'Finance',
       (T1.BUDGET), 0)) as "Finance", sum(decode(T1.DEPARTMENT, 'Marketing',
       (T1.BUDGET), 0)) as "Marketing", sum(decode(T1.DEPARTMENT, 'Pacific Rim Headquarters',
       (T1.BUDGET), 0)) as "Pacific Rim Headquarters", sum(decode(T1.DEPARTMENT, 'Quality Assurance',
       (T1.BUDGET), 0)) as "Quality Assurance", sum(decode(T1.DEPARTMENT, 'Research and Development',
       (T1.BUDGET), 0)) as "Research and Development", sum(decode(T1.DEPARTMENT, 'Sales and Marketing',
       (T1.BUDGET), 0)) as "Sales and Marketing", sum(decode(T1.DEPARTMENT, 'Software Development',
       (T1.BUDGET), 0)) as "Software Development", sum(decode(T1.DEPARTMENT, 'Software Products Div.',
       (T1.BUDGET), 0)) as "Software Products Div.", sum((T1.BUDGET)) TOTAL
from DEPARTMENT T1 
...
Рейтинг: 0 / 0
Аналог PIVOT или как можно расписать данные
    #39151580
dedRasta
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ivan_PisarevskydedRastaв доках предупреждают, что этого лучше не делатьТак точно, там обрыв. в многопользовательской среде гарантированы не то только грабли, но и вилы.

Все правильно, я там и не решился, выполнил на локальной копии базы, а уже созданную таблицу перелил на локальный сервер.
...
Рейтинг: 0 / 0
Аналог PIVOT или как можно расписать данные
    #39151754
Dozent
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Времени было мало.

Пока остановился на этом это почти то что надо

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
with tmp1(MyFieldName) as (select distinct t1.id_d
from detailing t1),

tmp2(MyPivotSource) as (select 'iif(t1.id_d = '''||MyFieldName||''', t1.id_i, 0) as "'||MyFieldName||'"' from tmp1)
select 'select '||list(MyPivotSource)||'from detailing t2
left join detailing t1 on t2.id_d = t1.id_d'
from rdb$database
cross join tmp2

-----------------------

with blist as (
select
iif(t1.id_d = 1, t1.id_i, 0) as "1",
iif(t1.id_d = 2, t1.id_i, 0) as "2",
iif(t1.id_d = 3, t1.id_i, 0) as "3",
iif(t1.id_d = 4, t1.id_i, 0) as "4",
iif(t1.id_d = 5, t1.id_i, 0) as "5"
from detailing t2
left join detailing t1 on t2.id_d = t1.id_d
group by    1,2,3,4,5
)



Ещё нашёл решение через Ehlib PivotGrid пока и туда и туда компаю...
...
Рейтинг: 0 / 0
Аналог PIVOT или как можно расписать данные
    #39151904
AndreyTarasov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dedRastaAndreyTarasov,
вчера как раз пришлось срочно заниматься чем-то подобным.
Получилось что-то типа этого (хотя в доках предупреждают, что этого лучше не делать):
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
execute block 
as
declare variable y integer;
declare variable stmt varchar(255);
begin
  for select distinct
    f_tab.year_rep
  from f_tab
  order by f_tab.year_rep
  into
  :y
  do begin 
    stmt = 'alter table gtt_rep add "'
    || cast( y as varchar(4))
    || '" float default 0';
    execute statement stmt;
  end
end



а я временные таблицы не создаю, я в execute block сразу формирую нужный отчет
случилось так что заказчик вроде продумал все данные в базе, а вот фантазии на отчеты у него не хватило и я решил просто сделать дизайнер отчетов, где программа в полуавтоматическом режиме формирует любой запрос
общая идея такая:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
execute block
returns
(fld_name varchar(80), fld1 numeric(15,2), fld2 numeric(15,2), fld3 numeric(15,2))
as
declare variable xx integer;
begin
for select fio, idx from table1 into :fld_name,:xx do
begin
select ..... from .... into fld1;
select ..... from .... into fld2;
select ..... from .... into fld3;
suspend;
end
end
...
Рейтинг: 0 / 0
Аналог PIVOT или как можно расписать данные
    #39152111
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello, Andreytarasov!

почему бы для отчетов не использовать отчётники?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Аналог PIVOT или как можно расписать данные
    #39154934
Dozent
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дело в том что мне не просто отчёт вывести надо а вывести таблицей данные
...
Рейтинг: 0 / 0
Аналог PIVOT или как можно расписать данные
    #39154942
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dozent,

Отчётники и в ексель сохранять умеют!
...
Рейтинг: 0 / 0
Аналог PIVOT или как можно расписать данные
    #39155195
AndreyTarasov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DozentДело в том что мне не просто отчёт вывести надо а вывести таблицей данные

делай через execute block, если один отчет - то обойдешься 2мя запросами или вообще одним

у меня в конструкторе отчетов несколько блоков, для удобства пользователей:
блок для определения количества колонок
блок с шаблоном запроса, где выделены места повторяющиеся по количеству колонок
и еще блок запроса параметров
...
Рейтинг: 0 / 0
25 сообщений из 34, страница 1 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Аналог PIVOT или как можно расписать данные
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]