Oracle
將查詢結果拆分為多個部分
我在考試中得到了這個問題,老師要求我們使用游標使用以下規則提高雇主的工資:
- 薪水最高的第一季度額外增加 4%。
- 薪水最高的第二季度額外增加 6%。
- 其餘的額外 8%
如何解決這個問題。
我的嘗試是
SELECT SALARY FROM (SELECT * FROM EMP ORDER BY SALARY) rownum > count(*)/4
首先獲得薪水,然後添加 %4 加薪並將其更新為新值。我還沒有測試過它,但我想它可能會起作用,但我認為它有點牽強,可能有更好或更有效的解決方案,你們的想法?
為了解決您的問題,我執行了以下操作:
創建表和數據:
CREATE TABLE salesperson (id INTEGER, salary INTEGER); INSERT INTO salesperson VALUES (1, 100000); INSERT INTO salesperson VALUES (2, 80000); INSERT INTO salesperson VALUES (3, 60000); INSERT INTO salesperson VALUES (4, 50000); INSERT INTO salesperson VALUES (5, 30000); INSERT INTO salesperson VALUES (6, 25000); INSERT INTO salesperson VALUES (7, 12000); INSERT INTO salesperson VALUES (8, 10000);
然後執行此查詢(此處為 SQLFiddle ):
WITH cte AS ( SELECT id, salary, NTILE(4) OVER (ORDER BY salary) AS quartile FROM salesperson ) -- <<== you can do a SELECT * FROM cte to see what's happening! SELECT id, salary, CASE quartile WHEN 1 THEN salary * 1.08 WHEN 2 THEN salary * 1.08 WHEN 3 THEN salary * 1.06 WHEN 4 THEN salary * 1.04 END as new_salary FROM cte;
結果:
ID SALARY NEW_SALARY 1 100000 104000 2 80000 83200 3 60000 63600 4 50000 53000 5 30000 32400 6 25000 27000 7 12000 12960 8 10000 10800
HTH,歡迎來到論壇!:-)
您可以在此處閱讀 Oracle NTILE 文件,並在此處閱讀出色的oracle-base 站點的說明。
編輯:
您也可以一次性完成 - 但我認為 cte(COMMON TABLE EXPRESSION - 或 WITH 子句)更清楚地顯示了思維過程。因此:
SELECT id, salary, CASE NTILE(4) OVER (ORDER BY salary) WHEN 1 THEN salary * 1.08 WHEN 2 THEN salary * 1.08 WHEN 3 THEN salary * 1.06 WHEN 4 THEN salary * 1.04 END as new_salary FROM salesperson ORDER BY id;
同樣的結果(小提琴)!