2014-10-16 5 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 

Кстати, можно разделить столбец «Возраст Range» в двух различных колонки: «Минимальный возраст» и «Max Age», если это более легко реализовать.

Любая рекомендация, как это сделать?

+0

Укажите какой-либо ввод пожалуйста. – SonalPM

+0

Предполагается, что трехлетние диапазоны перекрываются? – TheConstructor

+0

@ TheConstructor: Я не уверен, что полностью понял ваш вопрос. Значения в столбце возраста неизвестны. Вполне возможно, что возрастов не будет, например, 34-36, и поэтому этот диапазон не будет включен в выходной столбец «Возрастного диапазона». – Omri

ответ

0

Я думаю, что это может быть то, что вы хотите (это частично адаптированный подход в ответ Дипак Pawar, но с поправкой на синтаксис 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

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 
Смежные вопросы