暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 将行转置为列

askTom 2018-06-27
327

问题描述

嗨,

我的问题是关于将行转换为列:

BANNER_CODE/DIV_CODE/LEG_MATNR/SAP_MATNR/MAKTX/LEG_MATKL/SAP_MATKL/LEG_WHERL/SAP_WHERL/
CS/1/10137/58351/BAKE KING CHOCOLATE RICE 160G/384/10203004/34/SG/1
GH/1/36762/212615/MYOJO BOWL NDLE THAI TOM YAM 105G/499/10103001/34/SG/2
CS/1/36762/212615/MYOJO BOWL NDLE THAI TOM YAM 105G/499/10103001/34/SG/3
SE/1/212615/212615/MYOJO BOWL NDLE THAI TOM YAM 105G/11060104/10103001/SG/SG/4
GH/6/56256/276019/GMS SHIN MIN 1COPY/1862/60507006/34/SG/5
CS/6/56256/276019/GMS SHIN MIN 1COPY/1862/60507006/34/SG/6
SE/6/276019/276019/GMS SHIN MIN 1COPY/15040101/60507006/SG/SG/7
GH/6/27112/110005765/KOMAX BIOKIPS FOOD CONTAINER 3.1L/2108/60207005/17/CN/8


我已经如上采样了数据。我的要求是根据键列 (SAP_MATNR) 和banner_code将所有这些记录转置为列。
所以,我需要的输出有点类似于下面的格式。
SAP_MATNR/DIV_CODE_GH/DIV_CODE_CS/DIV_CODE_SE/LEG_MATNR_GH/LEG_MATNR_CS/LEG_MATNR_SE/LEG_MATKL_GH/LEG_MATKL_CS/LEG_MATKL_SE/SAP_MATKL_GH/SAP_MATKL_CS/SAP_MATKL_SE
58351//1///10137///384///10203004/
212615/1/1/1/36762/36762/212615/499/499/11060104/10103001/10103001/10103001
276019/6/6/6/56256/56256/276019/1862/1862/15040101/60507006/60507006/60507006
110005765/6///27112////2108///60207005/


在上面的输出中,SAP_MATNR列将用作键,banner_code值将与所有列标题后缀,并且相应的值将放置在此处。
我已经浏览了许多与枢轴查询相关的文章,但不知何故无法找到动态执行此操作的方法。列和行的列表仅是示例,因为在我的原始要求中,我有大约100个字段,其值必须以这种格式显示。请帮助我为此提供最佳的动态解决方案。

专家解答

任何不在pivot子句中的列形成隐式group by。并且您可以在枢轴的第一部分中使用许多聚合。所以:

-使用子查询选择输出中所需的所有列
-聚合您想要枢转的所有列。确保你给他们化名!
-通过CS和GH进行枢轴banner_code。

这给出了:

create table am_art_basic (
  banner_code   varchar2( 100 ),
  div_code      varchar2( 100 ),
  leg_matnr     varchar2( 100 ),
  sap_matnr     varchar2( 100 ),
  maktx         varchar2( 100 ),
  leg_matkl     varchar2( 100 ),
  sap_matkl     varchar2( 100 ),
  leg_wherl     varchar2( 100 ),
  sap_wherl     varchar2( 100 )
);

Insert into AM_ART_BASIC 
   (BANNER_CODE, DIV_CODE, LEG_MATNR, SAP_MATNR, MAKTX,  
    LEG_MATKL, SAP_MATKL, LEG_WHERL, SAP_WHERL) 
 Values 
   ('SE', '6', '276019', '276019', 'GMS SHIN MIN 1COPY',  
    '15040101', '60507006', 'SG', 'SG');

Insert into AM_ART_BASIC 
   (BANNER_CODE, DIV_CODE, LEG_MATNR, SAP_MATNR, MAKTX,  
    LEG_MATKL, SAP_MATKL, LEG_WHERL, SAP_WHERL) 
 Values 
   ('SE', '1', '212615', '212615', 'MYOJO BOWL NDLE THAI TOM YAM 105G',  
    '11060104', '10103001', 'SG', 'SG');

Insert into AM_ART_BASIC 
   (BANNER_CODE, DIV_CODE, LEG_MATNR, SAP_MATNR, MAKTX,  
    LEG_MATKL, SAP_MATKL, LEG_WHERL, SAP_WHERL) 
 Values 
   ('CS', '1', '010137', '58351', 'BAKE KING CHOCOLATE RICE 160G',  
    '000384', '10203004', '34', 'SG');

Insert into AM_ART_BASIC 
   (BANNER_CODE, DIV_CODE, LEG_MATNR, SAP_MATNR, MAKTX,  
    LEG_MATKL, SAP_MATKL, LEG_WHERL, SAP_WHERL) 
 Values 
   ('CS', '1', '036762', '212615', 'MYOJO BOWL NDLE THAI TOM YAM 105G',  
    '000499', '10103001', '34', 'SG');

Insert into AM_ART_BASIC 
   (BANNER_CODE, DIV_CODE, LEG_MATNR, SAP_MATNR, MAKTX,  
    LEG_MATKL, SAP_MATKL, LEG_WHERL, SAP_WHERL) 
 Values 
   ('CS', '6', '056256', '276019', 'GMS SHIN MIN 1COPY',  
    '001862', '60507006', '34', 'SG');

Insert into AM_ART_BASIC 
   (BANNER_CODE, DIV_CODE, LEG_MATNR, SAP_MATNR, MAKTX,  
    LEG_MATKL, SAP_MATKL, LEG_WHERL, SAP_WHERL) 
 Values 
   ('GH', '6', '027112', '110005765', 'KOMAX BIOKIPS FOOD CONTAINER 3.1L',  
    '002108', '60207005', '17', 'CN');

Insert into AM_ART_BASIC 
   (BANNER_CODE, DIV_CODE, LEG_MATNR, SAP_MATNR, MAKTX,  
    LEG_MATKL, SAP_MATKL, LEG_WHERL, SAP_WHERL) 
 Values 
   ('GH', '6', '056256', '276019', 'GMS SHIN MIN 1COPY',  
    '001862', '60507006', '34', 'SG');

Insert into AM_ART_BASIC 
   (BANNER_CODE, DIV_CODE, LEG_MATNR, SAP_MATNR, MAKTX,  
    LEG_MATKL, SAP_MATKL, LEG_WHERL, SAP_WHERL) 
 Values 
   ('GH', '1', '036762', '212615', 'MYOJO BOWL NDLE THAI TOM YAM 105G',  
    '000499', '10103001', '34', 'SG');

COMMIT;

select * from (
  select sap_matnr, banner_code, leg_matkl, div_code 
  from   am_art_basic
) pivot (
  min(div_code) div_code, 
  min(leg_matkl) matkl
  for ( banner_code ) in (
    'CS' cs, 'GH' gh
  )
);

SAP_MATNR   CS_DIV_CODE   CS_MATKL   GH_DIV_CODE   GH_MATKL   
212615      1             000499     1             000499     
276019      6             001862     6             001862     
58351       1             000384                  
110005765                6             002108

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论