用wm_concat合并行及merge into更新

转载 2015年11月20日 15:45:09

已知需求:

kmb结构:
as_code varchar2(21),
as_name varchar2(30)
样例数据:(as_code列的编码是规则的,即3-3-3-3)
as_code     as_name
501         经费支出
501001      商品服务支出
501001001   办公费
501001001001  其他杂项支出

pzb结构:
as_code varchar2(21),
full_name varchar2(200)
样例数据
as_code               as_name
501              
501001
501001001
501001001001

现编写sql实现如下功能:
更新pzb的as_name列,使名称按全称显示即:
as_code       full_name
501           经费支出
501001        经费支出-商品服务支出
501001001     经费支出-商品服务支出-办公费
501001001001  经费支出-商品服务支出-办公费-其他杂项支出

--造表及数据
create table kmb(
as_code varchar2(21) CONSTRAINT kmb_pk PRIMARY KEY,
as_name varchar2(30)) ;

create table pzb(
as_code varchar2(21) CONSTRAINT pzb_fk_kmb REFERENCES kmb(as_code),
full_name varchar2(200));

insert into kmb(as_code, as_name) values('501','经费支出');
insert into kmb(as_code, as_name) values('501001','商品服务支出');
insert into kmb(as_code, as_name) values('501001001','办公费');
insert into kmb(as_code, as_name) values('501001001001','其他杂项支出');
insert into pzb(as_code) select as_code from kmb;
commit;

SQL> select * from kmb;

AS_CODE               AS_NAME
--------------------- ------------------------------
501                           经费支出
501001                    商品服务支出
501001001              办公费
501001001001       其他杂项支出

SQL> select * from pzb;

AS_CODE               FULL_NAME
--------------------- ------------------------------
501                  
501001               
501001001            
501001001001         

--实现:oracle提供了一个函数wm_concat函数可以合并列,利用此函数将表kmb中同一个大类的as_name的不同列按顺序合并成一行,wm_concat默认连接字符为',',可用replace将其转换成'-'以符合需求,这样即可得出最细分类的串。最后按条件取结果集用merge into更新pzb表的full_name字段。脚本如下:
SQL> merge into pzb p
  2  using (
  3  select p.as_code as_code, substr(a.wm, 1, instr(a.wm, '-', 1, length(p.as_code)/3)-1) full_name
  4         from kmb p,
  5   (select as_code, replace(wm, ',','-')||'-' wm from
  6     (select min(as_code) as_code, wm_concat(as_name) wm from kmb where 1=1 group by substr(as_code,1,3)))a
  7          where substr(p.as_code,1,3)=a.as_code)a
  8  on (p.as_code=a.as_code)
  9  when matched then
 10  update set full_name=a.full_name;
 
SQL> commit;
SQL> select * from pzb;

AS_CODE                 FULL_NAME
---------------------     ------------------------------------------
501                              经费支出
501001                       经费支出-商品服务支出
501001001                 经费支出-商品服务支出-办公费
501001001001          经费支出-商品服务支出-办公费-其他杂项支出

相关文章推荐

Oracle数据库合并行记录,WMSYS.WM_CONCAT 函數的用法

Sql代码   select t.rank, t.Name from t_menu_item t;         10 CLARK     10 KING     10...

oracle wm_concat函数简单实例(实现行转成用分隔符分隔的一列)

主从表关联查询出从表某个字段的值用逗号连接起来 主表:故障单表 SP_PD_FAULT 从表:报障单表 SP_PD_FAULT_REPORT 目的:通过故障单关联查询出该故障单的报障单号,且用逗号分隔...

oracle查询结果中wmsys.wm_concat组合一列多行结果,以及每行中某些列的组合结果

首先,创建表mytest: create table mytest (id number,name varchar2(30)); 向mytest表中插入值: insert into mytes...

JAVA执行mysql脚本和mysql相关命令(alter table示例/多表更新/Insert Into Select/多表查询) 及ibatis模糊查询(concat用法)

MYSQL常用命令列表   11

oracle函数wm_concat行转列

一、需求:数据库表一对多查询结果单行显示 数据库中的两张表:教师表(TEACHER)、教师所教科目表(TEACHER_KM),现在要查询教师信息列表,把教师的科目信息以语文、数学这种形式展示,也就是说...

关于ORACLE wmsys.wm_concat 行转列函数使用

转自http://blog.csdn.net/pengdingxu10/article/details/46438567 这两天在项目中遇到了一个问题,就是系统中使用了wmsys.wm_conc...

Oracle之多行记录变一行记录,行变列,并排序(wmsys.wm_concat)

wmsys.wm_concat Definition: The Oracle PL/SQL WM_CONCAT function is used to aggregate data from a n...

行转列方法,decode()与wmsys.wm_concat()

SQL>select * from test_tb_grade t;   ID USER_NAME COURSE SCORE 1 ...

数据库:行转列(wm_concat)

WMSYS.WM_CONCAT 函數的用法(2010-09-10 09:52:07) select t.rank, t.Name from t_menu_item t;     10 ...

PANDAS 数据合并与重塑(concat join/merge)

1 concat concat函数是在pandas底下的方法,可以将数据根据不同的轴作简单的融合 pd.concat(objs, axis=0, join='outer', join_axes=...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用wm_concat合并行及merge into更新
举报原因:
原因补充:

(最多只允许输入30个字)