• EBS_SQL_技巧:关于行转列


    遇到一个行转列的问题:

    Select h.COMP_NAME,round(h.FINAL_SCORE,2) As FINAL_SCORE,h.CARD_PERIOD_MEANING
    from cux_hrsc_headers_t_v h
    where 1=1
    And CARD_YEAR = P_YEAR
    And department_id Is Null 

    转换sql:

    WITH pivot_data As
         (Select h.COMP_NAME,round(h.FINAL_SCORE,2) As FINAL_SCORE,h.CARD_PERIOD_MEANING
                    from cux_hrsc_headers_t_v h
                  where 1=1
                  And CARD_YEAR = P_YEAR
                  And department_id Is Null
                  Union All
                  Select h.COMP_NAME,round(Avg(h.FINAL_SCORE),2) As FINAL_SCORE,'平均分' As CARD_PERIOD_MEANING
                  from cux_hrsc_headers_t_v h
                  where 1=1
                  And CARD_YEAR = P_YEAR
                  And department_id Is Null
                  Group By h.COMP_NAME)
    
    Select * from pivot_data
                PIVOT (
                SUM(FINAL_SCORE)        --<-- pivot_clause
                FOR CARD_PERIOD_MEANING          --<-- pivot_for_clause
                IN  ('01月' As "01月",'02月' As "02月",'03月' As "03月",'04月' As "04月",'05月' As "05月",'06月' As "06月",
                     '07月' As "07月",'08月' As "08月",'09月' As "09月",'10月' As "10月",'11月' As "11月",'12月' As "12月",
                     '平均分' As "平均分")   --<-- pivot_in_clause
                )
                Order By 14 Desc

    之后发现需要用视图,并且要带入参数:于是

    create or replace package p_view_param is
    
      -- Author  : MARTIN
      -- Created : 2016/10/28 10:13:56
      -- Purpose : 
      
     Function set_param(num Varchar2) Return Varchar2; 
     Function get_param Return Varchar2; 
    
    end p_view_param;
    /
    create or replace package body p_view_param is
     paramValue Varchar2(50); 
     Function set_param(num Varchar2) Return Varchar2 Is 
     Begin 
     paramValue:=num; 
     Return num;
     end;
     Function get_param Return Varchar2 Is
     Begin 
     Return paramValue; 
     end; 
    end p_view_param;

    创建视图:

    create or replace view cux_hrsc_org_rank_v as 
    Select * from (Select h.COMP_NAME,round(h.FINAL_SCORE,2) As FINAL_SCORE,h.CARD_PERIOD_MEANING
                    from cux_hrsc_headers_t_v h
                  where 1=1
                  And CARD_YEAR = p_view_param.get_param()
                  And department_id Is Null
                  Union All
                  Select h.COMP_NAME,round(Avg(h.FINAL_SCORE),2) As FINAL_SCORE,'平均分' As CARD_PERIOD_MEANING
                  from cux_hrsc_headers_t_v h
                  where 1=1
                  And CARD_YEAR = p_view_param.get_param()
                  And department_id Is Null
                  Group By h.COMP_NAME)
    PIVOT (
    SUM(FINAL_SCORE)        --<-- pivot_clause
    FOR CARD_PERIOD_MEANING          --<-- pivot_for_clause
    IN  ('01月','02月','03月','04月','05月','06月','07月','08月','09月','10月','11月','12月','平均分')   --<-- pivot_in_clause
    )
    Order By 14 desc
    ;

    sql中引用:

    select * from cux_hrsc_org_rank_v where p_view_param.set_param(2016)=2016

     然后发现oracle将'01月'作为了标题列,那么要如何引用呢?

    参照:

    显然,Oracle将其识别为了字符串。应该怎么做呢?我们需要使用双引号。之所以Oracle会识别错误,就因为’’的常量识别优先级高于列名称优先级。我们需要让Oracle忽略这个特点,就使用双引号。

    http://blog.itpub.net/17203031/viewspace-754807/

    create or replace view cux_hrsc_DEPT_rank_v as 
    WITH pivot_data As
         (Select h.DEP_NAME As COMP_NAME,round(h.FINAL_SCORE,2) As FINAL_SCORE,h.CARD_PERIOD_MEANING
                    from cux_hrsc_headers_t_v h
                  where 1=1
                  And CARD_YEAR = p_view_param.get_param()
                  And ORGANIZATION_ID = 81
                  And department_id Is Not Null
                  Union All
                  Select h.DEP_NAME As COMP_NAME,round(Avg(h.FINAL_SCORE),2) As FINAL_SCORE,'平均分' As CARD_PERIOD_MEANING
                  from cux_hrsc_headers_t_v h
                  where 1=1
                  And CARD_YEAR = p_view_param.get_param()
                  And ORGANIZATION_ID = 81
                  And department_id Is Not Null
                  Group By h.DEP_NAME)
    
    Select COMP_NAME,"'01月'" M01,"'02月'" M02,"'03月'" M03,"'04月'" M04,"'05月'" M05,"'06月'" M06,
                     "'07月'" M07,"'08月'" M08,"'09月'" M09,"'10月'" M10,"'11月'" M11,"'12月'" M12,
                     "'平均分'"  平均分
    from pivot_data
                PIVOT (
                SUM(FINAL_SCORE)        --<-- pivot_clause
                FOR CARD_PERIOD_MEANING          --<-- pivot_for_clause
                IN  ('01月','02月','03月','04月','05月','06月',
                     '07月','08月','09月','10月','11月','12月',
                     '平均分')   --<-- pivot_in_clause
                )
    Order By 14 Desc
                
                
     
    select * from cux_hrsc_org_rank_v where p_view_param.set_param(2016)=2016
    Cursor Cur_Template Is
     select * from cux_hrsc_org_rank_v h where p_view_param.set_param(P_YEAR)=P_YEAR;
    FOR r_lookups IN Cur_Template Loop
          cux_conc_utl.out_msg('<LINE>');
          cux_conc_utl.out_msg('<COMP_NAME>' ||r_lookups.COMP_NAME||'</COMP_NAME>');
          cux_conc_utl.out_msg('<M01>' ||r_lookups.M01||'</M01>');
  • 相关阅读:
    小伙子的毕业设计
    mongoDB
    Java面试题笔试题收集
    react-router4 介绍
    React 组件间通信 总结
    react ajax
    react应用(基于react脚手架)
    React 之 组件生命周期
    组件收集表单数据
    组件的组合使用
  • 原文地址:https://www.cnblogs.com/hopedba/p/6006789.html
Copyright © 2020-2023  润新知