Oracle

將查詢結果拆分為多個部分

  • June 7, 2019

我在考試中得到了這個問題,老師要求我們使用游標使用以下規則提高雇主的工資:

  • 薪水最高的第一季度額外增加 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;

同樣的結果(小提琴)!

引用自:https://dba.stackexchange.com/questions/240028