Объединение столбцов - PullRequest
       3

Объединение столбцов

1 голос
/ 21 октября 2011

Я пытаюсь сделать следующее: У меня есть таблица с ename, job, deptno и sal. Я пытаюсь инициировать запрос, который возвращает лучших заемщиков каждого отдела. Я сделал это с помощью группировки и подзапроса. Тем не менее, я также хочу отобразить среднюю сумму по deptno. Таким образом, результатом будет следующее:

"ename"  "dept"  "sal"  "average of dept"
sal      20      1000   500   
kelly    30      2000   800 
mika     40      3000   400

это может быть невозможно, так как среднее значение не ассоциируется с другими строками.

Любое предложение будет оценено. Благодарю. Я использую Oracle 10g для выполнения моих запросов.

Ответы [ 3 ]

2 голосов
/ 21 октября 2011

Вы можете использовать аналитические функции :

WITH RankedAndAveraged AS (
  SELECT
    ename,
    dept,
    sal,
    RANK() OVER (PARTITION BY dept ORDER BY sal DESC) AS rnk,
    AVG(sal) OVER (PARTITION BY dept) AS "average of dept"
  FROM atable
)
SELECT
  ename,
  dept,
  sal,
  "average of dept"
FROM RankedAndAveraged
WHERE rnk = 1

Это может вернуть более одного сотрудника на отдел, если все они имеют одинаковое максимальное значение sal. Вы можете заменить RANK() на ROW_NUMBER(), если вам нужен только один человек на отдел (в этом случае вы также можете дополнительно расширить ORDER BY, указав дополнительные критерии сортировки для выбора верхнего элемента, в противном случае он будет выбран случайным образом из числа с максимальной зарплатой).

1 голос
/ 21 октября 2011

Это должно работать. Единственная хитрость в том, что если у вас в отделе несколько сотрудников с максимальной зарплатой, это покажет их всех.

SELECT t.ename, t.deptno, mx.sal as sal, mx.avg_sal as avg_sal
FROM tbl t, 
  (SELECT MAX(sal) AS sal, AVG(sal) AS avg_sal, deptno
   FROM tbl
   GROUP BY deptno) mx
WHERE t.deptno = mx.deptno AND t.sal = mx.sal
0 голосов
/ 21 октября 2011

Не уверен насчет Oracle, не использовал его около 10 лет, но что-то вроде этого должно быть возможным:

SELECT
  ename, deptno, sal,
  (SELECT AVG(T2.sal)
    FROM tbl T2
    WHERE T2.deptno = T.deptno
  ) AS average_of_dept
FROM tbl T
GROUP BY deptno
HAVING sal = MAX(sal)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...