一分多行列转换(Gbase版)

打印 上一主题 下一主题

主题 1055|帖子 1055|积分 3165

1、源数据表结构

  1. CREATE TABLE "sf_ref_pd_config" (
  2.   "I_BATCH_NO" decimal(5,0) DEFAULT NULL COMMENT '批次ID',
  3.   "V_ASSET_CLASS_NAME" varchar(200) DEFAULT NULL COMMENT '资产类型',
  4.   "N_EXEC_ID" decimal(5,0) DEFAULT NULL COMMENT '执行排序',
  5.   "N_PD_ID" decimal(10,0) DEFAULT NULL COMMENT 'PD_ID',
  6.   "V_FIELD1_BUSINESS_TYPE" varchar(2000) DEFAULT NULL COMMENT '业务品种'
  7. ) ENGINE=EXPRESS REPLICATED  DEFAULT CHARSET=utf8 TABLESPACE='sys_tablespace' COMMENT='PD映射人工配置';
复制代码
2、插入测试数据

  1. INSERT INTO ifrs10.sf_ref_pd_config (I_BATCH_NO,V_ASSET_CLASS_NAME,N_EXEC_ID,N_PD_ID,V_FIELD1_BUSINESS_TYPE) VALUES
  2. (4,'信用卡',NULL,2,'1110160')
  3. ,(5,'零售信贷',NULL,2,'1110090,1110160,1110161,1110380')
  4. ,(5,'信用卡',NULL,3,'1110084,1110086,1110089,1110360')
  5. ,(4,'零售信贷',NULL,3,'1110030,1110084,1110086')
  6. ,(1,'信用卡',NULL,3,'1110071,1110082,1110087,1110088,1110100,1110110,1110120,1110140,1110370,1110410,1110755,1110760,1110765,1110940,1110950,1110050,1110055,1110090,1110161,1110380')
  7. ,(6,'零售信贷',NULL,1,'1110050')
  8. ,(6,'信用卡',NULL,3,'1110360')
  9. ,(1,'零售信贷',NULL,1,'1110050')
  10. ;
复制代码
3、新建关联表并插入大于逗号分隔符中的数据

  1. create table xx_sequence(id int);
复制代码
-- 插入数据(列数要大于逗号分隔符中的数据)
  1. insert into xx_sequence
  2. select rowid from ex_ods_bond_credit;
复制代码
4、行列转换查询

  1. SELECT N_PD_ID,
  2.        I_BATCH_NO,
  3.        V_ASSET_CLASS_NAME,
  4.        SUBSTRING_INDEX(SUBSTRING_INDEX(A.V_FIELD1_BUSINESS_TYPE,',',id+1),',',-1) col_new
  5. FROM sf_ref_pd_config a
  6. inner join xx_sequence tl
  7. on t1.id < LENGTH(A.V_FIELD1_BUSINESS_TYPE)-LENGTH(REPLACE(A.V_FIELD1_BUSINESS_TYPE,',',''))+1;
复制代码
5、后记

逗号分隔字符数据的又一种行列转换方式,脚本是源于Gbase数据库的,应该同样适用于Oracle。
附(原始SQL):

  1. SELECT
  2.     I_BATCH_NO,V_ASSET_CLASS_NAME,N_PD_ID,SUBSTRING_INDEX(SUBSTRING_INDEX(A.V_FIELD1_BUSINESS_TYPE,',',id+1),',',-1) AS num
  3. FROM
  4.     (select I_BATCH_NO,V_ASSET_CLASS_NAME,N_PD_ID,V_FIELD1_BUSINESS_TYPE from sf_ref_pd_config  ) A join
  5.     t1  WHERE
  6.     t1.id < LENGTH(A.V_FIELD1_BUSINESS_TYPE)-LENGTH(REPLACE(A.V_FIELD1_BUSINESS_TYPE,',',''))+1 ;
复制代码
及内网SQL图片:


关联文章:一分多行列转换(逗号分隔的一列数据转换成多行)-CSDN博客

一分多行列转换-CSDN博客


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

杀鸡焉用牛刀

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表