Я думаю, что это может быть то, что вы хотите (это частично адаптированный подход в ответ Дипак 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 |
Укажите какой-либо ввод пожалуйста. – SonalPM
Предполагается, что трехлетние диапазоны перекрываются? – TheConstructor
@ TheConstructor: Я не уверен, что полностью понял ваш вопрос. Значения в столбце возраста неизвестны. Вполне возможно, что возрастов не будет, например, 34-36, и поэтому этот диапазон не будет включен в выходной столбец «Возрастного диапазона». – Omri