Сайтец что надо Войти | Зарегаться  
 Последние новости
   
 
 
 
  Преобразование строк таблицы в столбцы
Категория: | Автор: admin | (5 октября 2012)
 
Обновлено: 6.06.2013 - 16:11

Преобразование строк таблицы в столбцы


create or replace package ovpt_pack is
procedure show_tbl(out_res out sys_refcursor);
end ovpt_pack;

create or replace package body ovpt_pack is

procedure show_tbl(out_res out sys_refcursor) as
v_cursor NUMBER;
v INTEGER;
count_row NUMBER;
iter NUMBER := 1;
ws_name VARCHAR2(100);
v_sql varchar2(1000);
v_sql_1 VARCHAR2(100) := 'select t1.bar_code, t1.bar_date, dep.* from ovpt_test1 t1,
(select * from workshop pivot(count(id) for name in (';
v_sql_2 VARCHAR2(100) := ')) order by 1) dep';
v_sql_in VARCHAR2(500) := '';
v_temp varchar2(5) := ', ';
begin
select count(*) into count_row from workshop;

while iter <= count_row loop
select ws.name
into ws_name
from workshop ws
where ws.ID between iter and iter;

if iter = count_row then
v_temp := '';
end if;

v_sql_in := v_sql_in || '''' || ws_name || '''' || v_temp;
--dbms_output.put_line('ws=' || v_sql_in);
iter := iter + 1;
end loop;
v_sql := v_sql_1 || v_sql_in || v_sql_2;

open out_res for v_sql;
end show_tbl;

end ovpt_pack;

Доработка чтобы отображать данные из двух таблиц:
select bc.bar_code, bc.bar_date, dep.* from bar_code bc, (select * from bar_ws pivot(count(id_ws) for name_ws in ('Цех №1', 'Цех №2', 'Цех №3', 'Цех №4', 'Цех №5', 'Цех №6', 'Цех №7')) order by 1) dep;

Второй способ:
  procedure show_catlist_check(in_id_group in number,
out_res out sys_refcursor) as
v_id_group number := nvl(in_id_group, 0);
-- статичные запросы
v_sql_s1 varchar2(200) := 'select t.id_user, workflow.pak_user_info.Get_Personal_FIO(t.id_user) as P_F';
v_sql_s2 varchar2(100) := ' from cardres_userlist t where t.id_group = ' ||
v_id_group || ' order by P_F';
-- для динамики
v_sql_d1 varchar2(200) := ', decode((select count(*) from cardres_checklist t1 where t.id_user = t1.id_user and t1.id_group = ' ||
v_id_group || ' and t1.id_catalog = ';
v_sql_d2 varchar2(50) := '), 1, 1, 0) as CAT_';
-- динамический
v_sql varchar2(5000) := v_sql_s1;
cursor cat_list is
select t1.id_key
from cardres_catlist t1
join cardres_catgroup t2
on t1.id_key = t2.id_catalog
where t1.id_par > 0
and t2.id_group = v_id_group
order by t1.id_key;
begin
-- формируем строку запроса с динамическими столбцами
for cat_row in cat_list loop
v_sql := v_sql || v_sql_d1 || cat_row.id_key || v_sql_d2 ||
cat_row.id_key;
end loop;
v_sql := v_sql || v_sql_s2;

dbms_output.put_line(v_sql);

open out_res for v_sql;
end show_catlist_check;

/*
select distinct t.id_user,
decode((select t1.check_accept
from cardres_checklist t1
where t.id_user = t1.id_user
and t1.id_catalog = 1), 1, 1, 0) as cat1,
0 as cat2
from cardres_userlist t
where t.id_group = 2
*/


 


Только зарегистрированные пользователи могут оставлять в данной новости свои комментарии.
  Copyright © 2012 МегаКодер