2017-04-01 79 views
0

首先隨時糾正我的英文和 我剛剛開始PL/SQL。如何從PL/SQL中的表中獲取x索引行?

這是我的PL/SQL代碼。 有一張名爲'EMP'的員工信息表。

我的目標是獲得員工工資的中位數。 因此,如果員工數量很奇怪,那麼我需要中間人員。

如果是,那麼我需要兩個中間的平均值。

它做到目前爲止的工作,即時通訊只是在「if」語句後感到困惑。 獲得第n個索引行值的最簡單方法是什麼?

SET SERVEROUTPUT ON 

DECLARE 
    counter Int(4); 
    osszeg Int(5); 
    temp EMP.sal%TYPE; 

CURSOR wage IS 
    SELECT EMP.SAL 
    FROM EMP 
    ORDER BY EMP.SAL ASC; 


BEGIN  
    OPEN wage; 
    counter := 0; 

LOOP 
    FETCH wage 
    INTO temp; 
    EXIT WHEN wage%NOTFOUND; 
    counter := counter + 1;  
END LOOP;  
CLOSE wage; 

,我需要幫助從這裏

IF MOD(counter,2) = 0 THEN 

ELSE 


END IF; 

END; 
+0

在學習PLSQL之前,要明白在RDBMS中,表是無序的一組行。除非您指定正確的順序,否則沒有第一/中間/第n /最後一行。 – GurV

+0

我知道對不起,我忘了按升序排序。 – George312

回答

0

我希望它簡單但不正確的

IF MOD(counter,2) = 0 THEN 
    //first_number = counter/2 
    //second_number = first_number+1 
    //avg= (first_number+second_number)/2 

ELSE 
    //first_number = counter/2; 
    //avg = first_number+1 

END IF; 
+0

我想它只會返回行的索引的平均值。不與行的平均值。 – George312

+0

首先你應該訂購專欄。 如果您檢索相應的索引值然後計算平均值,這也很容易。 –

+0

我已經更新了訂單的描述。 – George312

1

您可以使用分析功能,它更容易爲您解決在SQL中,不使用PL/SQL。

select t.*, 
     case 
      when mod(totcnt, 2) = 0 then 
      (Wage + LeadWage)/2 
      else 
      Wage 
     end 
    from (select rownum RN, num, count(*) over(partition by 1) TotCnt, 
       lead(Wage) over (order by Wage) LeadWage 
      from Emp) t 
where t.Rn = round(TotCnt/2); 

,或者,如果你想使用PL/SQL,你應該存儲你的中間值作爲對變量(目前的工資值和以前的工資值內您將獲取操作,直到你不知道是你的集的工資單數甚至是偶數),並且在取回使用中進行循環時,應始終計算以前迭代的每個步驟中的中值。

0

如果您只想要所有員工的工資中位數(sal),那麼只需使用MEDIAN功能即可。

從emp中選擇中值(sal)作爲median_wage;

它可用作聚合函數和分析函數。

相關問題