我有一個任務來計算部門的最低工資,以及總工資的百分比。 另外我只能使用一條select語句,並且可能是我需要使用窗口函數。如何計算列中的百分比?
這是我如何開始:
SELECT distinct department_id,
min(salary) over(partition by department_id) as min_sal
FROM employees;
但是,如果使用RATIO_TO_REPORT功能它顯示所有的表,而不是由部門標識分組。
我有一個任務來計算部門的最低工資,以及總工資的百分比。 另外我只能使用一條select語句,並且可能是我需要使用窗口函數。如何計算列中的百分比?
這是我如何開始:
SELECT distinct department_id,
min(salary) over(partition by department_id) as min_sal
FROM employees;
但是,如果使用RATIO_TO_REPORT功能它顯示所有的表,而不是由部門標識分組。
聽起來
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
是的,我需要他們所有的人,我使用類似於你的最後一個查詢,但有一個捕獲,它可以選擇一個語句。你的第一個查詢在各方面都是完美的,只不過它計算出錯誤的百分比。 –
@ E.Saraf - 帶有子查詢(子選擇語句)的select語句仍然是單個select語句。那麼:如果你認爲我的第一次計算是錯誤的,請解釋它是錯誤的 - 否則我不能認真對待你。 (反正你可能是錯的,但我不能告訴你如果你不分享你認爲不正確的東西。) – mathguy
你的計算是正確的。但是我需要知道百分之多少百分比的最低工資是來自總額,而不是部門總和。在第二個查詢中很容易修復,但是有沒有辦法在第一個查詢中執行? –
您是否需要輸出每個員工一行(很奇怪),或者每個部門只需要一行?或者您是否需要以最低薪水獲得員工姓名? – mathguy
分享一些樣本數據集和預期結果。 – XING