2014-10-16 115 views
0

我正在使用Oracle SQL,我需要查詢幫助。數值範圍的平均值

我有如下表:

Age (int) 
Salary (int) 

輸入例如:

Age | Slary 
18 | 5000 
18 | 10000 
20 | 11000 
24 | 9000 
21 | 6000 
21 | 7000 
22 | 6000 
28 | 22000 

我需要通過年齡的範圍來計算平均工資。每兩年都是一場風暴。輸出示例:

Age Range | Average Salary 
18 - 20 | 8666.666 
19 - 21 | 8000 
20 - 22 | 7500 
21 - 23 | 6333.33 
22 - 24 | 7500 
23 - 25 | 7500 
24 - 26 | 7500 
26 - 28 | 22000 
27 - 29 | 22000 
28 - 30 | 22000 

順便說一句,這是可能的分裂「年齡範圍」一欄分成兩個不同的列:「最小年齡」和「最大年齡」,如果它更容易實現。

任何建議如何做到這一點?

+0

請提供一些輸入.. – SonalPM 2014-10-16 11:53:42

+0

是否打算3年範圍重疊? – TheConstructor 2014-10-16 11:54:39

+0

@TheConstructor:我不知道我完全理解你的問題。年齡欄中的值未知。例如,可能沒有34-36的年齡值,因此此範圍將不會包含在「年齡範圍」輸出列中。 – Omri 2014-10-16 12:03:26

回答

0

我認爲這可能是你想要的東西(它在改編自通過迪帕克·帕瓦爾答案的方法的一部分,但調整到Oracle的語法)。我注意到23-25組的值在我的查詢中爲9000,但樣本數據爲7500,但我認爲樣本數據不正確,9000確實是正確的值(對於24-26也是如此)。

Oracle不是我的選擇數據庫,我相信通過更熟悉Oracle開發的人員可以改進查詢。

SQL Fiddle

的Oracle 11g R2架構設置

CREATE TABLE t ("Age" int, "Salary" int); 

INSERT ALL 
    INTO t ("Age", "Salary") VALUES (18, 5000) 
    INTO t ("Age", "Salary") VALUES (18, 10000) 
    INTO t ("Age", "Salary") VALUES (20, 11000) 
    INTO t ("Age", "Salary") VALUES (24, 9000) 
    INTO t ("Age", "Salary") VALUES (21, 6000) 
    INTO t ("Age", "Salary") VALUES (21, 7000) 
    INTO t ("Age", "Salary") VALUES (22, 6000) 
    INTO t ("Age", "Salary") VALUES (28, 22000) 
SELECT * FROM dual; 

查詢1

WITH counter 
AS ( 
    SELECT 
    LEVEL-1 low, 
    LEVEL+1 high 
    FROM DUAL 
    WHERE (LEVEL-1) >= (SELECT MIN("Age") FROM t) 
    CONNECT BY LEVEL-1 <= (SELECT MAX("Age") FROM t) 
) 

SELECT 
    (low || ' - ' || high) "Age Range", 
    Avg("Salary") "Average Salary" 
FROM t 
RIGHT OUTER JOIN counter c ON t."Age" >= c.low AND t."Age" <= c.high 
GROUP BY low, high 
ORDER BY 1 

Results

| AGE RANGE | AVERAGE SALARY | 
|-----------|-------------------| 
| 18 - 20 | 8666.666666666666 | 
| 19 - 21 |    8000 | 
| 20 - 22 |    7500 | 
| 21 - 23 | 6333.333333333333 | 
| 22 - 24 |    7500 | 
| 23 - 25 |    9000 | 
| 24 - 26 |    9000 | 
| 25 - 27 |   (null) | 
| 26 - 28 |    22000 | 
| 27 - 29 |    22000 | 
| 28 - 30 |    22000 | 
+0

謝謝!這就是我期待的。 – Omri 2014-10-17 13:03:28

1

這可能有助於(MSSQL腳本):

SELECT Cast(LowerLimit AS VARCHAR) + ' - ' 
     + Cast(UpperLimit AS VARCHAR) AgeRange, 
     Avg(salary)     averagesalary 
FROM MyTable t1 
     RIGHT OUTER JOIN (SELECT Age  AS LowerLimit, 
           Age + 2 AS UpperLimit 
         FROM MyTable) AS t2 
        ON t1.Age >= t2.LowerLimit 
         AND t1.Age <= t2.UpperLimit 
GROUP BY LowerLimit,UpperLimit