Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Аналог PIVOT или как можно расписать данные / 25 сообщений из 34, страница 1 из 2
11.01.2016, 00:23
    #39144196
Dozent
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аналог PIVOT или как можно расписать данные
Все добрый день, попытаюсь на словах изложить проблему с которой столкнулся.
Использую 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
11.01.2016, 00:28
    #39144197
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аналог PIVOT или как можно расписать данные
DozentВообщем, что-то на подобии отчёта.
"Коли нужен чёрт, так и иди к чёрту." (с) НВГ

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

К нему демки идут - посмотри для начала.
...
Рейтинг: 0 / 0
12.01.2016, 11:17
    #39145241
Dozent
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аналог PIVOT или как можно расписать данные
не могу найти, подскажите где демки искать?
...
Рейтинг: 0 / 0
12.01.2016, 11:42
    #39145273
Dozent
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аналог PIVOT или как можно расписать данные
Папка с демками пустая C:\Program Files (x86)\FastReports\Demos
...
Рейтинг: 0 / 0
12.01.2016, 11:56
    #39145304
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аналог PIVOT или как можно расписать данные
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
12.01.2016, 20:55
    #39145897
zeon11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аналог PIVOT или как можно расписать данные
Dozent,

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


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

Код: 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
16.01.2016, 19:36
    #39148866
Dozent
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аналог PIVOT или как можно расписать данные
не получается чо то этот запрос
...
Рейтинг: 0 / 0
17.01.2016, 12:58
    #39149032
Евгений Килин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аналог PIVOT или как можно расписать данные
Dozent,

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

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

Я разворачиваю таблицы через EXECUTE BLOCK, правда с именами колонок приходится мутить, но это мелочь
...
Рейтинг: 0 / 0
20.01.2016, 09:40
    #39151124
dedRasta
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аналог PIVOT или как можно расписать данные
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
20.01.2016, 12:45
    #39151329
Ivan_Pisarevsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аналог PIVOT или как можно расписать данные
dedRastaв доках предупреждают, что этого лучше не делатьТак точно, там обрыв. в многопользовательской среде гарантированы не то только грабли, но и вилы.
...
Рейтинг: 0 / 0
20.01.2016, 14:45
    #39151510
RADSeatle
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аналог PIVOT или как можно расписать данные
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
20.01.2016, 15:53
    #39151580
dedRasta
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аналог PIVOT или как можно расписать данные
Ivan_PisarevskydedRastaв доках предупреждают, что этого лучше не делатьТак точно, там обрыв. в многопользовательской среде гарантированы не то только грабли, но и вилы.

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

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

Код: 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
21.01.2016, 04:18
    #39151904
AndreyTarasov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аналог PIVOT или как можно расписать данные
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
21.01.2016, 11:32
    #39152111
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Аналог PIVOT или как можно расписать данные
Hello, Andreytarasov!

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

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

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

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


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