当前位置: 代码迷 >> Oracle开发 >> ORACLE CASE WHEN 出现多行的状况
  详细解决方案

ORACLE CASE WHEN 出现多行的状况

热度:22   发布时间:2016-04-24 06:35:04.0
ORACLE CASE WHEN 出现多行的情况
各位大神,求助一个问题:
两个表:
主表 TAB_MAIN 数据如下
MAIN_ID     COL_DE_ASSOR       COL_OE_ASSOR

10011          DE_ASSOR1               OE_ASSOR1 
10022          DE_ASSOR2               OE_ASSOR2
10033          DE_ASSOR3               OE_ASSOR3
10044          DE_ASSOR4               OE_ASSOR4
有两种 ASSOR  DE和 OE  存储在此表中

属性表: TAB_FCAA
FCAA_ID    IND_FLAG     col_comm
10011         1                     comment_111
10011         0                     comment_112
10022         1                     comment_221
10022         0                     comment_222 
10033         1                     comment_331
10033         0                     comment_332 

就是当TAB_FCAA.IND_FLAG =1 时认为 是DE 类型的comment,
当 TAB_FCAA.IND_FLAG =0 时认为 是OE 类型的comment,

现在本人这样写的SQL:
select ditstinct
MAIN_ID,
COL_DE_ASSOR,
COL_OE_ASSOR,
case when IND_FLAG=1 then col_comm end as de_com,
case when IND_FLAG=0 then col_comm end as oe_com
from TAB_MAIN
left join TAB_FCAA on TAB_MAIN.MAIN_ID=TAB_FCAA.FCAA_ID

这样一来结果就会出现多行数据:
MAIN_ID    COL_DE_ASSOR    COL_OE_ASSOR      de_com                           oe_com
10011         DE_ASSOR1           OE_ASSOR1              comment_111
10011         DE_ASSOR1            OE_ASSOR1                                                       comment_112
10022         DE_ASSOR2            OE_ASSOR2               comment_221
10022         DE_ASSOR2            OE_ASSOR2                                                       comment_222
10033         DE_ASSOR3            OE_ASSOR3               comment_331
10033         DE_ASSOR3           OE_ASSOR3                                                         comment_332
10044         DE_ASSOR4            OE_ASSOR4 

能否把DE 或者OE 类型的ASSOR 和comment  对应 在一行中 不需要出现上面多行的情况?

不知描述的清楚吗?

因本人现在没法拿到真实数据,印象大致如此, 故求助,谢谢大神们,分不多了,请海涵。

------解决思路----------------------
上面漏写了MAIN_ID的表名,修正下
select TAB_MAIN.MAIN_ID,
MAX(COL_DE_ASSOR) AS COL_DE_ASSOR,
MAX(COL_OE_ASSOR) AS COL_OE_ASSOR,
MAX(case when IND_FLAG=1 then col_comm end) as de_com,
MAX(case when IND_FLAG=0 then col_comm end) as oe_com
from TAB_MAIN
left join TAB_FCAA on TAB_MAIN.MAIN_ID=TAB_FCAA.FCAA_ID
GROUP BY TAB_MAIN.MAIN_ID

------解决思路----------------------
引用:


select distinct main_id,
                COL_DE_ASSOR,
                COL_OE_ASSOR,
                (select col_comm
                   from TAB_FCAA t2
                  where t1.main_id = t2.fcaa_id
                    and t2.ind_flag = 1) de_com,
                (select col_comm
                   from TAB_FCAA t2
                  where t1.main_id = t2.fcaa_id
                    and t2.ind_flag = 0) oe_com
  from TAB_MAIN t1

------解决思路----------------------
    select distinct
           MAIN_ID,
           COL_DE_ASSOR,
           COL_OE_ASSOR,
            de.col_comm as de_com,
            oe.col_comm as oe_com
      from TAB_MAIN
 left join TAB_FCAA de
        on TAB_MAIN.MAIN_ID = de.FCAA_ID
       AND de.IND_FLAG=1
 left join TAB_FCAA oe
        on TAB_MAIN.MAIN_ID = oe.FCAA_ID
       AND oe.IND_FLAG=0
  相关解决方案