2016-09-06 53 views
0

考慮我有一張表作爲Employee_Details,其中Employee_Name和Employee_Level被維護。如何選擇行數據作爲列標題並根據Oracle中的標題排列值?

對於實例

Employee_Details **

每個Employee_Level應根據

+0

水平是否固定?聽起來就像你想旋轉,但如何取決於你在哪個版本,以及它是否需要動態。 –

+0

是等級是固定的,員工姓名將與現有員工等級一起新添加。我正在使用Oracle 10g – Subburaj

回答

1

好東西,你提到你的Oracle版本employee_level我的輸出列,所有的Employee_name應當按字母順序排列( 10g在你的情況下) - 在大多數情況下應該包含在你的問題中。

這就排除了PIVOT的使用 - 就像這裏提供的解決方案:Need to arrange employee names as per their city column wise(然而,我在本答覆的最後提供了一個「手動」PIVOT解決方案)。

另一種方法是使用完整的外連接,就像這樣。由於迭代的完整外連接,您必須小心連接條件(請注意在最後一次連接條件中使用NVL)。

with 
    employee_details (employee_name, employee_level) as (
     select 'Vingesh' , 'Manager'   from dual union all 
     select 'Ragul' , 'Senior Manager' from dual union all 
     select 'Nivithen', 'Senior Manager' from dual union all 
     select 'Joe'  , 'Associate Manager' from dual union all 
     select 'Arul' , 'Manager'   from dual union all 
     select 'Rishi' , 'Manager'   from dual 
    ), 
    prep (employee_name, employee_level, rn) as (
     select employee_name, employee_level, 
       row_number() over (partition by employee_level order by employee_name) 
     from employee_details 
    ) 
select p1.employee_name as associate_manager, 
     p2.employee_name as manager, 
     p3.employee_name as senior_manager 
from (select employee_name, rn from prep where employee_level = 'Associate Manager') p1 
     full outer join 
     (select employee_name, rn from prep where employee_level = 'Manager')   p2 
      on p1.rn = p2.rn 
     full outer join 
     (select employee_name, rn from prep where employee_level = 'Senior Manager') p3 
      on nvl(p1.rn, p2.rn) = p3.rn 
order by 1, 2, 3 
; 

ASSOCIATE_MANAGER MANAGER   SENIOR_MANAGER 
----------------- ----------------- ----------------- 
Joe    Arul    Nivithen 
        Rishi    Ragul 
        Vingesh 

3 rows selected. 

您也可以使用相同的「prep」因式分解子查詢,並將迭代的完整外部聯接替換爲下面的select語句。您可能想嘗試這兩種解決方案,並查看哪些數據更快;結果應該是一樣的。

select min(case when employee_level = 'Associate Manager' 
       then employee_name end) as associate_manager, 
     min(case when employee_level = 'Manager' 
       then employee_name end) as manager, 
     min(case when employee_level = 'Senior Manager' 
       then employee_name end) as senior_manager 
from prep 
group by rn 
order by 1, 2, 3 
; 
+0

感謝您分享這兩個選項。我採取了第二種選擇,它解決了我的問題...... – Subburaj