2016-11-14 178 views
0

我有一個任務來計算部門的最低工資,以及總工資的百分比。 另外我只能使用一條select語句,並且可能是我需要使用窗口函數。如何計算列中的百分比?

這是我如何開始:

 SELECT distinct department_id, 
    min(salary) over(partition by department_id) as min_sal 
    FROM employees; 

但是,如果使用RATIO_TO_REPORT功能它顯示所有的表,而不是由部門標識分組。

+0

您是否需要輸出每個員工一行(很奇怪),或者每個部門只需要一行?或者您是否需要以最低薪水獲得員工姓名? – mathguy

+0

分享一些樣本數據集和預期結果。 – XING

回答

1

聽起來

select min(salary) as min_salary, round(min(salary)/sum(salary) * 100 , 1) as percent 
from employees 
group by department_id 
; 

如果您還需要誰在每個部門的最低工資(假設有永遠只有一個)僱員的姓名,然後加入

, min(empl_name) keep (dense_rank first order by salary) as min_sal_empl_name 

SELECT聲明。如果薪酬水平最低,並且你需要全體員工,請說出來 - 在這種情況下,你可能需要分析功能。喜歡的東西:

select empl_name, salary, round(salary/tot_sal*100, 1) as percent 
from (select empl_name, salary, 
       sum(salary) over (partition by department_id)   as tot_sal, 
       rank() over (partition by department_id order by salary) as rn 
     from employees 
     ) 
where rn = 1 
; 

新增:OP表示,他們需要的工資作爲畢竟工資總額(所有部門)的百分比。這可以通過將ratio_to_report()與空窗開放條件(不由「任何東西」分區)相結合來完成,rank()由部門劃分以在每個部門中獲取最低工資。

如果您不喜歡over()作爲ratio_to_report()中的窗口子句,它也可以寫爲over (partition by null)以使其非常清晰,無需分區。

該解決方案使用SCOTT模式中的EMP表進行測試,因爲原始帖子不包含示例數據。

select deptno, empno, ename, sal, percent 
from (
     select empno, ename, sal, deptno, 
       round(100 * ratio_to_report(sal) over(), 1) as percent, 
       rank() over (partition by deptno order by sal) as rn 
     from scott.emp 
     ) 
where rn = 1 
; 


DEPTNO EMPNO ENAME SAL PERCENT 
------ ----- ------ ---- ------- 
10  7934 MILLER 1300  4.5 
20  7369 SMITH 800  2.8 
30  7900 JAMES 950  3.3 
+0

是的,我需要他們所有的人,我使用類似於你的最後一個查詢,但有一個捕獲,它可以選擇一個語句。你的第一個查詢在各方面都是完美的,只不過它計算出錯誤的百分比。 –

+0

@ E.Saraf - 帶有子查詢(子選擇語句)的select語句仍然是單個select語句。那麼:如果你認爲我的第一次計算是錯誤的,請解釋它是錯誤的 - 否則我不能認真對待你。 (反正你可能是錯的,但我不能告訴你如果你不分享你認爲不正確的東西。) – mathguy

+0

你的計算是正確的。但是我需要知道百分之多少百分比的最低工資是來自總額,而不是部門總和。在第二個查詢中很容易修復,但是有沒有辦法在第一個查詢中執行? –