读书人

100分求教 竖改横显示的有关问题

发布时间: 2013-06-25 23:45:42 作者: rapoo

100分求教 竖改横显示的问题
地区 省份 市 县 商店名称 商品编号 商品名称 规格 进货数量 库存数量
----------------------------------------------------
华北 内蒙 XX市 精品屋 1 巧克力 10*10 30 10
华北 内蒙 XX市 精品屋 23 旺旺 10*20 10 20
华中 河南 安阳市 园艺加工 1 巧克力 10*10 20 30
华中 河南 安阳市 园艺加工 70 小不点 15 20 1
... ...
-----------------------------------------------------
要实现的结果
-------------------------------------------------------
地区 省份 市 县 商店名称 商品编号 商品名称 规格 进货数量 库存数量 商品编号 商品名称 规格 进货数量 库存数量 商品编号 商品名称 规格 进货数量 库存数量
------------------------------------------------------------------------------------
华北 内蒙 XX市 精品屋 1 巧克力 10*10 30 10 23 旺旺 10*20 10 20
华中 河南 安阳市 园艺加工 1 巧克力 10*10 20 30 70 小不点 15 20 1
... ...
-------------------------------------------------------------------------------------



结果部分中的商品名称、ID、规格等是根据数据库有多少商品 生成多少个的

[解决办法]
估计得用过程?
[解决办法]
原表有10列,你是想把前面3列一样的话,后面都连成一列吗?如果前面3列一样的行有很多的话,那连成的表就有很多列,这样的话,你怎么显示啊。最好有个规则。比如前面3列一样的行,最多2行。
[解决办法]
原表有10列,你是想把前面4列一样的话,后面都连成一列吗?如果前面4列一样的行有很多的话,那连成的表就有很多列,这样的话,你怎么显示啊。最好有个规则。比如前面4列一样的行,最多3行,是这样的吗?

[解决办法]


create table tp_test as (
select '华北' "地区", '内蒙' "省份", 'XX市 ' "市县", '精品屋 ' "商店名称", 1 "商品编号", '巧克力' "商品名称", '10*10' "规格", 30 "进货数量", 10 "库存数量" from dual union
select '华北' "地区", '内蒙' "省份", 'XX市 ' "市县", '精品屋 ' "商店名称", 23 "商品编号", '旺旺 ' "商品名称", '10*20' "规格", 10 "进货数量", 20 "库存数量" from dual union
select '华中' "地区", '河南' "省份", '安阳市' "市县", '园艺加工' "商店名称", 1 "商品编号", '巧克力' "商品名称", '10*10' "规格", 20 "进货数量", 30 "库存数量" from dual union
select '华中' "地区", '河南' "省份", '安阳市' "市县", '园艺加工' "商店名称", 70 "商品编号", '小不点' "商品名称", '15 ' "规格", 20 "进货数量", 1 "库存数量" from dual
)
;
declare
v_sql varchar2(1000);
v_column varchar2(500);
v_drop varchar2(50);
begin
with tb2 as
(select
a.*
,row_number() over(partition by 地区,省份,市县,商店名称 order by 商品编号) row_num
from tp_test a
)
select max(replace(SYS_CONNECT_BY_PATH('max(decode(row_num,'
[解决办法]
level
[解决办法]
',商品编号)) 商品编号'
[解决办法]
level
[解决办法]
',max(decode(row_num,'
[解决办法]
level
[解决办法]
',商品名称)) 商品名称'
------解决方案--------------------


level
[解决办法]
'
,max(decode(row_num,'
[解决办法]
level
[解决办法]
',规格)) 规格'
[解决办法]
level
[解决办法]
',max(decode(row_num,'
[解决办法]
level
[解决办法]
',进货数量)) 进货数量'
[解决办法]
level
[解决办法]
',max(decode(row_num,'
[解决办法]
level
[解决办法]
',库存数量)) 库存数量'
[解决办法]
level,'/'),'/',',')) into v_column
from dual
connect by level <= (select max(row_num) from tb2)
;
select
decode(count(1),'1','drop table tp_test01','commit') into v_drop
from user_tables where table_name = upper('tp_test01')
;
execute immediate v_drop;
v_sql := 'create table tp_test01
as
select
地区,省份,市县,商店名称'
[解决办法]
v_column
[解决办法]
'
from (select a.*, 1 row_num from tp_test a where 1=2)
group by 地区,省份,市县,商店名称
'
;
execute immediate v_sql;
v_sql := 'insert into tp_test01
with tb2 as
(
select
a.*
,row_number() over(partition by 地区,省份,市县,商店名称 order by 商品编号) row_num
from tp_test a
)
select
地区,省份,市县,商店名称'
------解决方案--------------------


v_column
[解决办法]
'
from tb2
group by 地区,省份,市县,商店名称'
;
execute immediate v_sql;
commit;
end;

select * from tp_test01;



[解决办法]
借一下五楼的表结构及数据:

写复杂了,仅供娱乐。。。100分求教 竖改横显示的有关问题

declare
v_tab_sql varchar2(4000);
n1 number;
str varchar2(4000);
begin

--动态建表
begin
execute immediate 'drop table TP_TEST_temp';
exception
when others then
null;
end;
select max(count(1))
into n1
from TP_TEST t
group by t.地区, t.省份, t.市县, t.商店名称;

v_tab_sql := 'create table TP_TEST_temp
(地区 CHAR(4),省份 CHAR(4),市县 CHAR(6),商店名称 CHAR(8),';
if (n1 > 1) then
for i in 1 .. n1 - 1 loop
v_tab_sql := v_tab_sql
[解决办法]
'
商品编号'
[解决办法]
i
[解决办法]
' NUMBER,
商品名称'
[解决办法]
i
[解决办法]
' CHAR(6),
规格'
[解决办法]
i
[解决办法]
' CHAR(5),
进货数量'
[解决办法]
i
[解决办法]
' NUMBER,
库存数量'
[解决办法]
i
[解决办法]
' NUMBER,';
end loop;
end if;
v_tab_sql := v_tab_sql
[解决办法]
'
商品编号 NUMBER,商品名称 CHAR(6),规格 CHAR(5),进货数量 NUMBER,库存数量 NUMBER)';
-- dbms_output.put_line(v_tab_sql);
execute immediate v_tab_sql;

--补齐数据
for j in (select t.地区, t.省份, t.市县, t.商店名称, count(1) cnt
from TP_TEST t


group by t.地区, t.省份, t.市县, t.商店名称) loop
for ins in 1 .. n1 - j.cnt loop
insert into TP_TEST
select j.地区,
j.省份,
j.市县,
j.商店名称,
null,
null,
null,
null,
null
from dual;
end loop;
end loop;

--插入数据
for x in (select t.地区
[解决办法]
','
[解决办法]
t.省份
[解决办法]
','
[解决办法]
t.市县
[解决办法]
','
[解决办法]
t.商店名称
[解决办法]
','
[解决办法]

wm_concat(t.商品编号
[解决办法]
','
[解决办法]
t.商品名称
[解决办法]
','
[解决办法]
t.规格
[解决办法]
','
[解决办法]

t.进货数量
[解决办法]
','
[解决办法]
t.库存数量) str
from TP_TEST t
group by t.地区, t.省份, t.市县, t.商店名称) loop
str := 'insert into TP_TEST_temp select ';
for i in (select regexp_substr(x.str, '[^,]+', 1, level) str, level lv


from dual
connect by level <= regexp_count(x.str, ',') + 1) loop
str := str
[解决办法]
''''
[解决办法]
i.str
[解决办法]
''' c'
[解决办法]
i.lv
[解决办法]
',';
end loop;
str := substr(str, 1, length(str) - 1)
[解决办法]
' from dual';
-- dbms_output.put_line(str);
execute immediate str;
str := '';
end loop;
commit;
end;

读书人网 >oracle

热点推荐