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

Oracle 在1行中显示多行结果

askTom 2016-05-04
341

问题描述

如果唯一键与前一行相同,我将尝试将多行数据,特别是OPER_CD字段显示到相邻的列中。每个唯一键最多可以有5个OPER_CD字段。我当前的代码非常长(可能需要一些清理)只生成那些具有最大5OPER_CD的记录,即它丢失了只有1OPER_CD或2或3的记录,等等。代码是在多次重复相同的数据集时构建的。下面是我的WHERE子句,生成的当前结果和我想要的结果。

我是否应该在WHERE子句中使用Case函数,如果是,我不知道如何编写它?

其中M.UKEY = N.UKEY
和N.UKEY = O.UKEY
和O.UKEY = P.UKEY
和P.Ukey = Q.Ukey
和M.SEQOPCD > N.SEQOPCD
和N.SEQOPCD > O.SEQOPCD
和O.SEQOPCD > P.SEQOPCD
和P.SEQOPCD > Q.SEQOPCD

当前结果:
F编号ID编号OPCD1 OPCD2 OPCD3 OPCD4 UKEY
08*** 1N4AL3AP6DN490306 JX22AA JD011A JD023A JD01AA EF67A 1N4AL3AP6DN490306653226 3
18** 1N4AL3AP0EC327874 JD023A JD01AA JD011A JX22AA EF68AA 1N4AL3AP0EC327874566486 A
32** 1N4AL3AP0DN496246 JE99AA JD023A JD01AA JD011A EL62AA 1N4AL3AP0DN496246491 H
33** 1N4AL3AP8DN513522 JX22AA EF68AA JD023A JD011A JD01AA 1N4AL3AP8DN513522385888 A

所需结果:
F编号ID编号OPCD1 OPCD2 OPCD3 OPCD4 UKEY
18** 1N4AL3AP0EC327874 JD023A JD01AA JD011A JX22AA EF68AA 1N4AL3AP0EC327874566486 A
24* 3N1CN7AP2DL82271 JD023A JX22AA 3N1CN7AP2DL82271338615 A
30** 1N4AL3AP9EC182916 JD01AA JD023A 1N4AL3AP9EC182916624340201
32** 1N4AL3AP0DN496246 JE99AA JD023A JD01AA JD011A EL62AA 1N4AL3AP0DN496246491 H
32** 1N6AD0CUXDN719043 VD9999 EL10AA RA10AA RA12AA 1N6AD0CUXDN719043324811 B
34** 1N4AL3AP8DN499525 EF68AA JD011A JX22AA JD01AA 1N4AL3AP8DN499525533854 D
34** JN8AS5MV7DW639310 JD80AA JD01AA JN8AS5MV7DW639310528943 A
34** 1N6AD0EV1FN707520 JE99AA JA011A 1N6AD0EV1FN707520306154 A
36** 5N1AT2MV9EC832113 EF68AA 5N1AT2MV9EC832113237690 A
36** 1N4AL3AP6DC207818 JE99AA 1N4AL3AP6DC207818287103 A
37** 5N1AR2MM2FC6222296 JD023A EF65AA 5N1AR2MM2FC62229666566 B
37** 1N4AL3AP7EC167248 EF71AA JD011A JD023A 1N4AL3AP7EC167248385610 A

其他信息和我的当前代码:
这是在我尝试以一行显示数据之前返回的原始数据集,其中UKEY是由ID编号|| INVOICE编号|| INVOICE行项目编号构造的唯一键。

原始数据集示例:
FNUMBER SEQ_NO OPCD SEQOPCD ID编号UKEY
18** 1 EF68AA 1N4AL3AP0EC327874 1N4AL3AP0EC32774566486 A
18** 2 JX22AA 2JX22AA 1N4AL3AP0EC327874 1N4AL3AP0EC32774566486 A
18** 3 JD011A 3JD011A 1N4AL3AP0EC327874 1N4AL3AP0EC327874566486 A
18** 4 JD01AA 4JD01AA 1N4AL3AP0EC327874 1N4AL3AP0EC32774566486 A
18** 5 JD023A 5JD023A 1N4AL3AP0EC327874 1N4AL3AP0EC32774566486 A

我正在尝试将上面的5行转换成1行:

F编号ID编号OPCD1 OPCD2 OPCD3 OPCD4
18** 1N4AL3AP0EC327874 JD023A JD01AA JD011A JX22AA EF68AA
UKEY
1N4AL3AP0EC327874566486 A

下面是我的当前代码,我已经通过代码中记录的简单连接标识了前一行,并且一遍又一遍地使用同一个表。

选择N.FCLTY_NO、N.VIN、M.OPER_CD OPCD、, N.OPER_CD OPCD1、O.OPER_CD OPCD2、P.OPER_CD OPCD3、Q.OPER_CD OPCD4、N.UKEY

( SELECT不同A.FCLTY_NO、B.SEQ_NO、B.OPER_CD、B.SEQ_NO||B.OPER_CD SEQOPCD、E.DESC_TX OPCD_DESC、, A.VIN_PFX_CD||A.VIN_SER_NO VIN、A.WO_NO、A.WOL_NO、C.WO_Open_DT、C.WO_COML_DT、,
C.L.SUBM_DT、C.VEH_Mile_QT、A.APPR_CVR_CD、A.PNC_CD、F.PNC_TX、D.PNC_NO PFP、, A.VIN_PFX_CD||A.VIN_SER_NO||A.WO_NO||A.WOL_NO UKEY
从DRBA.SVC_WOL_COMN_T A,
DRBA.SVC_WOL_OPER_T B ,
DRBA.SVC_WO_T C ,
DRBA.SVC_PRIM_Part_T D ,
DRBA.SVC_OPER_T E ,
DRBA.VSM_PNC_T F ,
用户9.TBL_VDECIDE_VINS G
其中G.VIN_PFX_CD = A.VIN_PFX_CD
和G.VIN_SER_NO = A.VIN_SER_NO
和A.FCLTY_NO = B.FCLTY_NO (+)
和A.VIN_PFX_CD = B.VIN_PFX_CD (+)
和A.VIN_SER_NO = B.VIN_SER_NO (+)
A.WO_NO = B.WO_NO (+)
和A.WOL_NO = B.WOL_NO (+)
和A.FCLTY_NO = C.FCLTY_NO (+)
和A.VIN_PFX_CD = C.VIN_PFX_CD (+)
和A.VIN_SER_NO = C.VIN_SER_NO (+)
和A.WO_NO = C.WO_NO (+)
和A.FCLTY_NO = D.FCLTY_NO (+)
和A.VIN_PFX_CD = D.VIN_PFX_CD (+)
和A.VIN_SER_NO = D.VIN_SER_NO (+)
和A.WO_NO = D.WO_NO (+)
和A.WOL_NO = D.WOL_NO (+)
和B.OPER_CD = E.OPER_CD
和A.PNC_CD = F.PNC_CD
与C.L.L.N.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O
A.FCLTY_NO、A.VIN_PFX_CD||A.VIN_SER_NO、A.WO_NO、A.WOL_NO、B.SEQ_NO)M ,
( SELECT不同A.FCLTY_NO、B.SEQ_NO、B.OPER_CD、B.SEQ_NO||B.OPER_CD SEQOPCD、E.DESC_TX OPCD_DESC、, A.VIN_PFX_CD||A.VIN_SER_NO VIN、A.WO_NO、A.WOL_NO、C.WO_Open_DT、C.WO_COML_DT、,
C.L.SUBM_DT、C.VEH_Mile_QT、A.APPR_CVR_CD、A.PNC_CD、F.PNC_TX、D.PNC_NO PFP、, A.VIN_PFX_CD||A.VIN_SER_NO||A.WO_NO||A.WOL_NO UKEY
从DRBA.SVC_WOL_COMN_T A,
DRBA.SVC_WOL_OPER_T B ,
DRBA.SVC_WO_T C ,
DRBA.SVC_PRIM_Part_T D ,
DRBA.SVC_OPER_T E ,
DRBA.VSM_PNC_T F ,
用户9.TBL_VDECIDE_VINS G
其中G.VIN_PFX_CD = A.VIN_PFX_CD
和G.VIN_SER_NO = A.VIN_SER_NO
和A.FCLTY_NO = B.FCLTY_NO (+)
和A.VIN_PFX_CD = B.VIN_PFX_CD (+)
和A.VIN_SER_NO = B.VIN_SER_NO (+)
A.WO_NO = B.WO_NO (+)
和A.WOL_NO = B.WOL_NO (+)
和A.FCLTY_NO = C.FCLTY_NO (+)
和A.VIN_PFX_CD = C.VIN_PFX_CD (+)
和A.VIN_SER_NO = C.VIN_SER_NO (+)
和A.WO_NO = C.WO_NO (+)
和A.FCLTY_NO = D.FCLTY_NO (+)
和A.VIN_PFX_CD = D.VIN_PFX_CD (+)
和A.VIN_SER_NO = D.VIN_SER_NO (+)
和A.WO_NO = D.WO_NO (+)
和A.WOL_NO = D.WOL_NO (+)
和B.OPER_CD = E.OPER_CD
和A.PNC_CD = F.PNC_CD
与C.L.L.N.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O
A.FCLTY_NO、A.VIN_PFX_CD||A.VIN_SER_NO、A.WO_NO、A.WOL_NO、B.SEQ_NO)N ,
( SELECT不同A.FCLTY_NO、B.SEQ_NO、B.OPER_CD、B.SEQ_NO||B.OPER_CD SEQOPCD、E.DESC_TX OPCD_DESC、, A.VIN_PFX_CD||A.VIN_SER_NO VIN、A.WO_NO、A.WOL_NO、C.WO_Open_DT、C.WO_COML_DT、,
C.L.SUBM_DT、C.VEH_Mile_QT、A.APPR_CVR_CD、A.PNC_CD、F.PNC_TX、D.PNC_NO PFP、, A.VIN_PFX_CD||A.VIN_SER_NO||A.WO_NO||A.WOL_NO UKEY
从DRBA.SVC_WOL_COMN_T A,
DRBA.SVC_WOL_OPER_T B ,
DRBA.SVC_WO_T C ,
DRBA.SVC_PRIM_Part_T D ,
DRBA.SVC_OPER_T E ,
DRBA.VSM_PNC_T F ,
用户9.TBL_VDECIDE_VINS G
其中G.VIN_PFX_CD = A.VIN_PFX_CD
和G.VIN_SER_NO = A.VIN_SER_NO
和A.FCLTY_NO = B.FCLTY_NO (+)
和A.VIN_PFX_CD = B.VIN_PFX_CD (+)
和A.VIN_SER_NO = B.VIN_SER_NO (+)
A.WO_NO = B.WO_NO (+)
和A.WOL_NO = B.WOL_NO (+)
和A.FCLTY_NO = C.FCLTY_NO (+)
和A.VIN_PFX_CD = C.VIN_PFX_CD (+)
和A.VIN_SER_NO = C.VIN_SER_NO (+)
和A.WO_NO = C.WO_NO (+)
和A.FCLTY_NO = D.FCLTY_NO (+)
和A.VIN_PFX_CD = D.VIN_PFX_CD (+)
和A.VIN_SER_NO = D.VIN_SER_NO (+)
和A.WO_NO = D.WO_NO (+)
和A.WOL_NO = D.WOL_NO (+)
和B.OPER_CD = E.OPER_CD
和A.PNC_CD = F.PNC_CD
与C.L.L.N.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O
A.FCLTY_NO、A.VIN_PFX_CD||A.VIN_SER_NO、A.WO_NO、A.WOL_NO、B.SEQ_NO)O、,
( SELECT不同A.FCLTY_NO、B.SEQ_NO、B.OPER_CD、B.SEQ_NO||B.OPER_CD SEQOPCD、E.DESC_TX OPCD_DESC、, A.VIN_PFX_CD||A.VIN_SER_NO VIN、A.WO_NO、A.WOL_NO、C.WO_Open_DT、C.WO_COML_DT、,
C.L.SUBM_DT、C.VEH_Mile_QT、A.APPR_CVR_CD、A.PNC_CD、F.PNC_TX、D.PNC_NO PFP、, A.VIN_PFX_CD||A.VIN_SER_NO||A.WO_NO||A.WOL_NO UKEY
从DRBA.SVC_WOL_COMN_T A,
DRBA.SVC_WOL_OPER_T B ,
DRBA.SVC_WO_T C ,
DRBA.SVC_PRIM_Part_T D ,
DRBA.SVC_OPER_T E ,
DRBA.VSM_PNC_T F ,
用户9.TBL_VDECIDE_VINS G
其中G.VIN_PFX_CD = A.VIN_PFX_CD
和G.VIN_SER_NO = A.VIN_SER_NO
和A.FCLTY_NO = B.FCLTY_NO (+)
和A.VIN_PFX_CD = B.VIN_PFX_CD (+)
和A.VIN_SER_NO = B.VIN_SER_NO (+)
A.WO_NO = B.WO_NO (+)
和A.WOL_NO = B.WOL_NO (+)
和A.FCLTY_NO = C.FCLTY_NO (+)
和A.VIN_PFX_CD = C.VIN_PFX_CD (+)
和A.VIN_SER_NO = C.VIN_SER_NO (+)
和A.WO_NO = C.WO_NO (+)
和A.FCLTY_NO = D.FCLTY_NO (+)
和A.VIN_PFX_CD = D.VIN_PFX_CD (+)
和A.VIN_SER_NO = D.VIN_SER_NO (+)
和A.WO_NO = D.WO_NO (+)
和A.WOL_NO = D.WOL_NO (+)
和B.OPER_CD = E.OPER_CD
和A.PNC_CD = F.PNC_CD
与C.L.L.N.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O
A.FCLTY_NO、A.VIN_PFX_CD||A.VIN_SER_NO、A.WO_NO、A.WOL_NO、B.SEQ_NO)P ,
( SELECT不同A.FCLTY_NO、B.SEQ_NO、B.OPER_CD、B.SEQ_NO||B.OPER_CD SEQOPCD、E.DESC_TX OPCD_DESC、, A.VIN_PFX_CD||A.VIN_SER_NO VIN、A.WO_NO、A.WOL_NO、C.WO_Open_DT、C.WO_COML_DT、,
C.L.SUBM_DT、C.VEH_Mile_QT、A.APPR_CVR_CD、A.PNC_CD、F.PNC_TX、D.PNC_NO PFP、, A.VIN_PFX_CD||A.VIN_SER_NO||A.WO_NO||A.WOL_NO UKEY
从DRBA.SVC_WOL_COMN_T A,
DRBA.SVC_WOL_OPER_T B ,
DRBA.SVC_WO_T C ,
DRBA.SVC_PRIM_Part_T D ,
DRBA.SVC_OPER_T E ,
DRBA.VSM_PNC_T F ,
用户9.TBL_VDECIDE_VINS G
其中G.VIN_PFX_CD = A.VIN_PFX_CD
和G.VIN_SER_NO = A.VIN_SER_NO
和A.FCLTY_NO = B.FCLTY_NO (+)
和A.VIN_PFX_CD = B.VIN_PFX_CD (+)
和A.VIN_SER_NO = B.VIN_SER_NO (+)
A.WO_NO = B.WO_NO (+)
和A.WOL_NO = B.WOL_NO (+)
和A.FCLTY_NO = C.FCLTY_NO (+)
和A.VIN_PFX_CD = C.VIN_PFX_CD (+)
和A.VIN_SER_NO = C.VIN_SER_NO (+)
和A.WO_NO = C.WO_NO (+)
和A.FCLTY_NO = D.FCLTY_NO (+)
和A.VIN_PFX_CD = D.VIN_PFX_CD (+)
和A.VIN_SER_NO = D.VIN_SER_NO (+)
和A.WO_NO = D.WO_NO (+)
和A.WOL_NO = D.WOL_NO (+)
和B.OPER_CD = E.OPER_CD
和A.PNC_CD = F.PNC_CD
与C.L.L.N.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O.O
A.FCLTY_NO、A.VIN_PFX_CD||A.VIN_SER_NO、A.WO_NO、A.WOL_NO、B.SEQ_NO) Q
其中M.UKEY = N.UKEY
和N.UKEY = O.UKEY
和O.UKEY = P.UKEY
和P.Ukey = Q.Ukey
和M.SEQOPCD > N.SEQOPCD
和N.SEQOPCD > O.SEQOPCD
和O.SEQOPCD > P.SEQOPCD
和P.SEQOPCD > Q.SEQOPCD

专家解答

哎哟!这是个大问题!

在我看来你只需要一个基本的支点。你说你服用了10克,所以你必须用老方法:

create table t (
  FNUMBER varchar2(10), 
  SEQ_NO  int,
  OPCD    varchar2(10),
  SEQOPCD varchar2(10),
  ID_NUM  varchar2(30),
  UKEY    varchar2(30)
);

insert into t values ('18**','1','EF68AA','1EF68AA','1N4AL3AP0EC327874','1N4AL3AP0EC327874566486 A');
insert into t values ('18**','2','JX22AA','2JX22AA','1N4AL3AP0EC327874','1N4AL3AP0EC327874566486 A');
insert into t values ('18**','3','JD011A','3JD011A','1N4AL3AP0EC327874','1N4AL3AP0EC327874566486 A');
insert into t values ('18**','4','JD01AA','4JD01AA','1N4AL3AP0EC327874','1N4AL3AP0EC327874566486 A');
insert into t values ('18**','5','JD023A','5JD023A','1N4AL3AP0EC327874','1N4AL3AP0EC327874566486 A');

select fnumber, id_num, ukey,
       max(case when seq_no = 5 then seqopcd end) opcd,
       max(case when seq_no = 4 then seqopcd end) opcd_1,
       max(case when seq_no = 3 then seqopcd end) opcd_2,
       max(case when seq_no = 2 then seqopcd end) opcd_3,
       max(case when seq_no = 1 then seqopcd end) opcd_4
from   t
group  by fnumber, id_num, ukey;

FNUMBER    ID_NUM                         UKEY                           OPCD       OPCD_1     OPCD_2     OPCD_3     OPCD_4   
---------- ------------------------------ ------------------------------ ---------- ---------- ---------- ---------- ----------
18**       1N4AL3AP0EC327874              1N4AL3AP0EC327874566486 A      5JD023A    4JD01AA    3JD011A    2JX22AA    1EF68AA   


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

评论