例如:表test (id,name ,score,class)      说明下:这个逻辑不存在的,关键问题怎么解决 
   select  score+20 as s,( case when id in(1,2,3) then  s  else s+10  end ) as c from test;这个运行的时候 在case语句中的  s总报错 !我现在就想用s这个别名,除了建个临时表还有其它什么办法 ????  

解决方案 »

  1.   


    select  score+20 as s,( case when id in(1,2,3) then  score+20  else score+30  end ) as c from test;
      

  2.   


    select  score+20 as s,( case when id in(1,2,3) then  score+20   else score+30 end ) as c from test;
      

  3.   

    如果要用到S,一般需要使用子查询了.select s , ( case when id in(1,2,3) then s else s+10 end ) c 
    from
    (
    select score+20 s , id from test
    ) t;
      

  4.   

    你的s是在查询时生成的 所以不能立刻就用 因为case的时候 查询还没结束 s还没生成
    要么就用临时表 要么就再嵌套一层 在外层用s
      

  5.   

    谢谢了 !不过我想说1 楼和2楼,我这只是个简单化的例子!本例子复杂多了!
    create or replace package body sta_contract_pkg is  procedure pro_sta_contract(i_etl_date in varchar2,
                                o_sqlcode  out integer,
                                o_msg      out varchar2) is
      begin
       o_sqlcode :=0;
       o_msg:='SUCCESS';
       insert into sta_contract(CONTRACT_ID             ,
                                CONTRACT_CATE_TYPE       ,
                               CUSTOMER_ID              ,
                               CUST_MNG_ID              ,
                               PRODUCT_CDE              ,
                               TP_COA_ID                ,
                               LOAN_GRADE_CDE           ,
                               EXTERNAL_CONTRACT_NBR    ,
                               CONTRACT_TRM             ,
                               CONTRACT_START_DTE       ,
                               CONTRACT_END_DTE         ,
                               CONTRACT_ACTIVATION_DTE  ,
                               CONTRACT_CREATION_DTE    ,
                               OVERDUE_DD               ,
                               LIVE_STS                 ,
                               CONTRACT_MATURITY_DTE    ,
                               CONTRACT_CLOSING_DTE     ,
                               CONTRACT_TYP             ,
                               CLOSING_IND              ,
                               NET_REFUND_AMT           ,
                               CITY_CDE                 ,
                               LOAN_CLASSIFICATION_CDE  ,
                               AREA_TYPE_CDE            ,
                               PROJECT_NBR              ,
                               LEASE_CATEGORY_CDE       ,
                               ASSET_CATEGORY           ,
                               FP_GROUP_ID              ,
                               FINANCIAL_PRODUCT_ID     ,
                               PROJECT_NME              ,
                               DEPARTMENT_CDE           ,
                               CHANNEL_CDE              ,
                               TOTAL_DISBURSEMENT_AMT   ,
                               MONTH_DISBURSEMENT_AMT   ,
                               YEAR_DISBURSEMENT_AMT    ,
                               SECURITY_DEPOSIT_AMT     ,
                               HANDLING_FEE_AMT         ,
                               MANAGMENT_FEE_AMT        ,
                               BAL                      ,
                               MON_AVG_BAL              ,
                               INTEREST_BAL             ,
                               PAYABLE_PRINCIPAL_AMT    ,
                               PAYABLE_INTEREST_AMT     ,
                               INTEREST_RTE             ,
                               OVERDUE_INTEREST_RTE     ,
                               BASE_RTE                 ,
                               ACTUAL_RTE               ,
                               XIRR_RTE                 ,
                               XNPV_AMT                 ,
                               CUR_GENERAL_PROVI_AMT    ,
                               CUR_SPECIFIC_PROV_AMT    ,
                               ORG_CDE                  ,
                               INDUSTRY_TYPE_CDE        ,
                               INDUSTRY_SUBTYPE_CDE     ,
                               LOW_COST_IND             ,
                               TRANS_IND                ,
                               FTP_INTEREST_RATE        ,
                               ORIGINAL_ORIGINAL_AMT    ,
                               ASSET_AMT                ,
                               INTEREST_INCOME_AMT      ,
                               INTEREST_OUTCOME_AMT     ,
                               NON_INTEREST_INCOME_AMT  ,
                               NON_INTEREST_OUTCOME_AMT ,
                              -- PROVISION_AMT            ,
                              -- ASSET_NBR                ,
                              -- FTP_INTEREST_OUTCOME_AMT ,
                              -- FTP_INTEREST_INCOME_AMT  ,
                              -- NET_INTEREST_AMT         ,
                             --  TAX_AMT                  ,
                             --  OPER_COST_AMT            ,
                              -- NET_INCOME_AMT           ,
                              -- CAPITAL_COST_AMT         ,
                             --  PRODUCTIVENESS_AMT       ,
                              -- ASSESS_PROFIT_AMT        ,
                             --  ASSESS_PROFIT_FEE_AMT    ,
                              -- SELL_FEE_AMT             ,
                              -- PROJ_SUPPORT_FEE_AMT     ,
                              -- TOTAL_ADJUST_AMT     
                               )
                     
                              
      

  6.   

    接上
     select  
                              cont.CONTRACT_ID         as CONTRACT_ID ,              --合同号
                              'A05001'                 as CONTRACT_CATE_TYPE,        --合同类别代码
                              cb.business_partner_id   as CUSTOMER_ID ,              --客户号
                              cr.business_partner_id   as CUST_MNG_ID ,              --客户经理号
                              lp.PRODUCT_CDE           as PRODUCT_CDE              , --产品号
                              '1'                      as TP_COA_ID                , --FTP定价ID
                              cont.LOAN_GRADE_CDE      as LOAN_GRADE_CDE           , --贷款级别代码
                              cont.EXTERNAL_CONTRACT_NBR  as EXTERNAL_CONTRACT_NBR    ,--外部合同号
     HERE                         (case when length(contract_maturity_dte) is null then contract_end_dte-contract_activation_dte
                                   else    contract_maturity_dte-contract_activation_dte end)  as CONTRACT_TRM,  --期限
                              -- '暂时没取'   as   CONTRACT_SECTION_TRM            ,----期限分段
                              cont.CONTRACT_START_DTE  as CONTRACT_START_DTE       ,---开始日期
                              cont.CONTRACT_END_DTE    as CONTRACT_END_DTE         ,--结束日期
                              cont.CONTRACT_ACTIVATION_DTE  as CONTRACT_ACTIVATION_DTE  ,--生效日期
                              cont.CONTRACT_CREATION_DTE  as CONTRACT_CREATION_DTE    ,--合同创建日期
                              cont.OVERDUE_DD  as OVERDUE_DD               ,     ---逾期天数
                              cont.LIVE_STS as LIVE_STS                 ,  -----合同当前状态
                              cont.CONTRACT_MATURITY_DTE as CONTRACT_MATURITY_DTE    ,--合同到期日
                              cont.CONTRACT_CLOSING_DTE  as CONTRACT_CLOSING_DTE     ,--合同关闭日期
                              cont.CONTRACT_TYP  as CONTRACT_TYP             ,--合同类型
                              cont.CLOSING_IND   as CLOSING_IND              ,--结束标识
                              cont.NET_REFUND_AMT  as NET_REFUND_AMT           ,--净偿还金额
                              cont.CITY_CDE  as CITY_CDE                 ,      --城市代码
                              cont.LOAN_CLASSIFICATION_CDE  as LOAN_CLASSIFICATION_CDE  ,--五级分类代码
                              cont.AREA_TYPE_CDE  as AREA_TYPE_CDE            ,--区域类型代码
                              cont.PROJECT_NBR  as PROJECT_NBR              ,  --项目号
                              cont.LEASE_CATEGORY  as LEASE_CATEGORY_CDE       ,--租赁类别代码
                              cont.ASSET_CATEGORY  as ASSET_CATEGORY           ,--资产类别
                              (select code from ma_busi_code_map where sour_id = 'CMS' and sour_code_type = 'Z12' and sour_cde=cont.FP_GROUP_ID) as FP_GROUP_ID,--金融产品组ID       
                              to_char(cont.FINANCIAL_PRODUCT_ID) as FINANCIAL_PRODUCT_ID     ,--金融产品ID
                              cont.PROJECT_NME  as PROJECT_NME     ,  --项目名
                              su.DEPARTMENT_CDE as DEPARTMENT_CDE           ,--部门号
                              cont.MARKETING_CHANNEL as CHANNEL_CDE          ,--渠道号
                              case select lvl2_cde from v_dim_product where product_cde =lp.PRODUCT_CDE 
                                    when 'MS110000' then td.DISBURSEMENT_AMT
                                    when 'MS120000' then  ASSET_AMT
                               end case   ,  --   历史累计投放                        
                              case select lvl2_cde from v_dim_product where product_cde =lp.PRODUCT_CDE 
                                    when 'MS110000' then select substr(to_char(disbursement_dte,'yyyymmdd'),1,6),sum(disbursement_amt) from ODS_TRANCHES_DETAIL group by substr(to_char(disbursement_dte,'yyyymmdd'),1,6)
                                    when 'MS120000' then  ASSET_AMT  --这个也要 按月来取 回头作
                               end case  as MONTH_DISBURSEMENT_AMT   ,--当月投放
                              case select lvl2_cde from v_dim_product where product_cde =lp.PRODUCT_CDE 
                                    when 'MS110000' then select substr(to_char(disbursement_dte,'yyyymmdd'),1,4),sum(disbursement_amt) from ODS_TRANCHES_DETAIL group by substr(to_char(disbursement_dte,'yyyymmdd'),1,4)
                                    when 'MS120000' then  ASSET_AMT  --这个也要 按年来取 回头作
                               end case as YEAR_DISBURSEMENT_AMT    ,--当年累计投放
                              td.SEC_DEPOSIT_AMT as SECURITY_DEPOSIT_AMT     ,--保证金金额
                               as HANDLING_FEE_AMT         ,    --zan mei  zuo  手续费金额(当月发生额)
                              td.MANAGMENT_FEE_AMOUNT  as MANAGMENT_FEE_AMT        ,   --管理费金额
                              (case select lvl2_cde from v_dim_product where product_cde =lp.PRODUCT_CDE 
                                    when MS110000 then  tp.BAL
                                    when MS120000 then  ASSET_AMT
                              END) as BAL                      ,  ---余额
                              '' as MON_AVG_BAL              ,    --本月日均余额
                             (case select lvl2_cde from v_dim_product where product_cde =lp.PRODUCT_CDE 
                              when 'MS110000' then tp.INTEREST_BAL)  as INTEREST_BAL             ,    --未偿还利息
                              (case select lvl2_cde from v_dim_product where product_cde =lp.PRODUCT_CDE 
                              when 'MS110000' then tp.PAYABLE_PRINCIPAL_AMT) as PAYABLE_PRINCIPAL_AMT    ,--本期应收本金
                           
                              (case select lvl2_cde from v_dim_product where product_cde =lp.PRODUCT_CDE 
                              when 'MS110000' then tp.PAYABLE_INTEREST_AMT) as PAYABLE_INTEREST_AMT     ,--本期应收利息
                               agree.INTEREST_RTE  as INTEREST_RTE,                  --合同利率
                              agree.OVERDUE_INTEREST_RTE as OVERDUE_INTEREST_RTE      ,--逾期利率
                              agree.BASE_RTE as BASE_RTE     ,--基准利率
                              agree.ACTUAL_RTE  as ACTUAL_RTE                 ,--实际利率
                              agree.XIRR_RTE as XIRR_RTE                 ,--XIRR利率
                              agree.XNPV_AMT as XNPV_AMT                 , --XNPV金额
                              pt.provision_amt as CUR_GENERAL_PROVI_AMT    ,--一般减值准备发生额
                              opt.provision_amt as CUR_SPECIFIC_PROV_AMT    ,--特殊减值准备发生额
                              '' as ORG_CDE                  ,--机构组织
                              tt.industry_type_cde  as INDUSTRY_TYPE_CDE        ,--行业类型代码
                              tt.industry_subtype_cde  as INDUSTRY_SUBTYPE_CDE     ,--行业子类型代码
                              (case when SECURITY_DEPOSIT_AMT>=TOTAL_DISBURSEMENT_AMT then 'T'
                                   else 'F' end ) as LOW_COST_IND             ,---低成本标识
                              CONTRACT_TRM  as TRANS_IND                ,--流转天数
                              --- as FTP_INTEREST_RATE        ,
                              --- as ORIGINAL_ORIGINAL_AMT    ,
                              ca.ASSET_AMT as ASSET_AMT                ,--资产额
                              sum(rt.INTEREST_SETTLED_AMT) as INTEREST_INCOME_AMT      ,--利息收入(月发生)
                              -- as INTEREST_OUTCOME_AMT     ,
                              sum(cc.settle_amt) as NON_INTEREST_INCOME_AMT  ,              --非利息收入(月发生)
                              sum(pc.charge_payable_amt) as NON_INTEREST_OUTCOME_AMT ,  --非利息支出(月发生)
                               /*as PROVISION_AMT            ,
                               as ASSET_NBR                ,
                               as FTP_INTEREST_OUTCOME_AMT ,
                               as FTP_INTEREST_INCOME_AMT  ,
                               as NET_INTEREST_AMT         ,
                               as TAX_AMT                  ,
                               as OPER_COST_AMT            ,
                               as NET_INCOME_AMT           ,
                               as CAPITAL_COST_AMT         ,
                               as PRODUCTIVENESS_AMT       ,
                               as ASSESS_PROFIT_AMT        ,
                               as ASSESS_PROFIT_FEE_AMT    ,
                               as SELL_FEE_AMT             ,
                               as PROJ_SUPPORT_FEE_AMT     ,
                               as TOTAL_ADJUST_AMT */     
      

  7.   

    接上:
     FROM   
                            ODS_CONTRACT cont
                         left outer join (select * from ods_contract_bp where role_cd=3) cb
                         on cont.contract_id=cb.contract_id 
                         left outer join (select * from ODS_CONTRACT_RESPONSIBLE_PERSO where designation_cde=5) cr
                         on cont.contract_id=cr.contract_id
                         left outer join STA_LEASECATE_PRODUCT_RELA lp
                         on cont.LEASE_CATEGORY_CDE=lp.LEASE_CATEGORY_CDE
                         left outer join  ODS_bp_sys_user su 
                         on cr.business_partner_id=su.pb_secondary_id
                         left outer join (select contract_id,sum(DISBURSEMENT_AMT) as DISBURSEMENT_AMT from ODS_TRANCHES_DETAIL group by contract_id) td
                         on td.contract_id=cont.contract_id
                         left outer join (select sch.CONTRACT_ID as CONTRACT_ID,
                                       sum(sch.principal_amt - plan.principal_settled_amt) as BAL,
                                       sum(sch.interest_amt-plan.interest_settled_amt) as INTEREST_BAL,
                                       sum(case when to_char(due_dte, 'YYYYMM') = substr('20101230', 1,6) then sch.PRINCIPAL_AMT else 0 end) as PAYABLE_PRINCIPAL_AMT,
                                       sum(case when to_char(due_dte, 'YYYYMM') = substr('20101230', 1,6) then sch.INTEREST_AMT else 0 end) as PAYABLE_INTEREST_AMT,                            from  
                                       ODS_RENTAL_AMORTIZATION_SCHEDU sch,ODS_REPAYMENT_PLAN plan
                                where   sch.CONTRACT_ID = plan.CONTRACT_ID and
                                        sch.AGREEMENT_SEQ = plan.AGREEMENT_SEQ and
                                        sch.RENTAL_ID = plan.RENTAL_ID 
                                group by sch.CONTRACT_ID ) tp 
                          on cont.contract_id = tp.contract_id
                          left outer join (select contract_id, 
                                                  sum(INTEREST_RTE) as INTEREST_RTE,
                                                  sum(OVERDUE_INTEREST_RTE) as OVERDUE_INTEREST_RTE,
                                                  sum(BASE_RTE) as BASE_RTE,
                                                  sum(ACTUAL_RTE) as ACTUAL_RTE,
                                                  sum(XIRR_RTE) as XIRR_RTE,
                                                  sum(XNPV_AMT) as XNPV_AMT
                                            from ODS_FINANCIAL_AGREEMENT 
                                                group by contract_id) agree
                          on agree.contract_id=cont.contract_id
                         left outer join (select a.contract_id as contract_id,
                                                 a.execution_dte,
                                                 a.provision_typ,
                                                 nvl(a.provision_amt,0)-nvl(c.provision_amt,0) as provision_amt 
                                          from  ods_PROVISION_TRANSACTION a
                                          left outer join ods_PROVISION_TRANSACTION c 
                                          on a.contract_id=c.contract_id and a.old_provision_dte=c.provision_dte and a.provision_typ=c.provision_typ
                                          where substr(to_char(a.execution_dte,'yyyymmdd'),1,6)=substr(ETL_DATE,1,6) and a.provision_typ='G'
                                         )pt
                         pt.contract_id=cont.contract_id
                         left outer join (select a.contract_id as contract_id,
                                                 a.execution_dte,
                                                 a.provision_typ,
                                                 nvl(a.provision_amt,0)-nvl(c.provision_amt,0) as provision_amt 
                                          from ods_PROVISION_TRANSACTION a
                                         left outer join ods_PROVISION_TRANSACTION c 
                                         on a.contract_id=c.contract_id and a.old_provision_dte=c.provision_dte and a.provision_typ=c.provision_typ
                                         where substr(to_char(a.execution_dte,'yyyymmdd'),1,6)=to_char(ETL_DATE,1,6) and a.provision_typ='S'
                                          )opt
                          on opt.contract_id=cont.contract_id
                         left outer join(select contract_id,
                                                industry_type_cde,
                                                industry_subtype_cde 
                                         from (select * from ods_CONTRACT_bp where role_cde=3) b 
                                         left outer join  ods_bp_company  c 
                                         on b.business_partner_id=c.business_partner_id
                                         )tt on cont.contract_id=tt.contract_id
                         left outer join(select b.contract_id as contract_id,
                                             nvl(c.vehicle_sale_amt,0) as ASSET_AMT
                                         from ods_contract_asset b 
                                         left outer join  ods_vehicle_information c 
                                         on b.asset_id=c.asset_id
                                         ) ca on ca.contract_id=cont.contract_id
                         left outer join (select contract_id,INTEREST_SETTLED_AMT from ods_RENTAL_TRANS b
                                          where  b.execution_dte>=to_date(substr(ETL_DATE,1,6)||'01','yyyymmdd') and b.execution_dte<=to_date(ETL_DATE,'yyyymmdd')
                                          ) rt on rt.contract_id= cont.contract_id
                         left outer join (select settle_amt,
                                                 contract_id 
                                          from ods_ctr_charge_receivable
                                          where execution_dte>=to_date(substr(ETL_DATE,1,6)||'01','yyyymmdd') and b.execution_dte<=to_date(ETL_DATE,'yyyymmdd')
                                          ) cc on cc.contract_id=cont.contract_id
                         left outer join (select contract_id,
                                                 charge_payable_amt 
                                          from ods_PAYABLE_CONTRACT b
                                          left outer join ods_payable_main c 
                                          on b.payable_id=c.payable_id and execution_dte>=to_date(substr(ETL_DATE,6)||'01','yyyymmdd')and execution_dte<=to_date(ETL_DATE,'yyyymmdd')
                                          ) pc on pc.contract_id=cont.contract_id;
                               
      end; 
    end sta_contract_pkg;