Невозможно достичь MAX (COUNT) и иметь несколько столбцов - PullRequest
0 голосов
/ 08 мая 2020

У меня есть 4 таблицы: EMPLOYEE, DRIVER, TRIP и TRIPLEG

Таблица EMPLOYEE имеет имя, которое я хочу извлечь и показать с помощью MAX count, имеет E #, которая используется совместно с DRIVER DRIVER, таблица имеет L # (лицензия number), который является общим для TRIP

Таблица TRIP имеет T # (номер поездки), который является общим для TRIPLEG

Я пытаюсь найти максимальное количество Tripleg, которое сделал водитель (в в этом случае драйвер с номером лицензии 10002:

SELECT MAX(COUNT(TRIPLEG.LEG#))
FROM TRIP, TRIPLEG
ON TRIP.T# = TRIPLEG.T#
WHERE TRIP.L# = 10002
GROUP BY TRIP.T#

COUNT (TRIPLEG.LEG #) дает мне https://i.imgur.com/AYAovov.png,

, поэтому я сделал вышеуказанное MAX (COUNT (TRIPLEG.LEG #)), что дает мне следующее: https://i.imgur.com/alCFlO3.png

Я не могу продолжить, поскольку пытался ВЫБРАТЬ больше столбцов (TRIP.T #), например

SELECT TRIP.T#, MAX(COUNT(TRIPLEG.LEG#))
FROM TRIP, TRIPLEG
ON TRIP.T# = TRIPLEG.T#
WHERE TRIP.L# = 10002
GROUP BY TRIP.T#

Выдает сообщение об ошибке: ORA-00937: не функция одногрупповой группы

Есть какой-нибудь совет? Нужно иметь возможность начать с малого и выбирать, прежде чем я смогу присоединиться к другим таблицам, чтобы получить имя сотрудника отображается рядом с MAX tripleg count

Заранее спасибо

По сути, я хочу кое-что li ke: (только 1 строка, которая составляет МАКСИМАЛЬНОЕ количество выполненных троек (5))

NAME     MAX(COUNT(TRIPLEG.LEG#))
-----------------------------------
BOB      5

Ответы [ 2 ]

0 голосов
/ 08 мая 2020

У меня нет вашей таблицы, поэтому я буду использовать EMP и DEPT Скотта (поскольку вы используете Oracle, поэтому я полагаю, вы знакомы с ними). ​​

Это работает:

SQL> select d.dname, count(e.empno) cnt
  2  from emp e join dept d on e.deptno = d.deptno
  3  where d.deptno in (10, 20)
  4  group by d.dname;

DNAME                 CNT
-------------- ----------
ACCOUNTING              3
RESEARCH                5      --> MAX count is this

SQL>

Вложенный счетчик работает, если в списке SELECT столбцов нет других столбцов (вы это уже знаете), и возвращает желаемое значение:

SQL> select max(count(e.empno)) cnt
  2  from emp e join dept d on e.deptno = d.deptno
  3  where d.deptno in (10, 20)
  4  group by d.dname;

       CNT
----------
         5

SQL>

Но это не сработает (вы тоже это знаете):

select d.dname, max(count(e.empno)) cnt
from emp e join dept d on e.deptno = d.deptno
where d.deptno in (10, 20)
group by d.dname;

Чтобы исправить это, используйте CTE (общее табличное выражение, также известное как предложение факторизации WITH) или встроенное представление; Я покажу вам первый вариант с еще одним дополнением: я ранжирую подсчитываю, нахожу «самый высокий» и использую его позже, чтобы выбрать только желаемую строку.

SQL> with tcnt as
  2    (select d.deptno,
  3            d.dname,
  4            count(e.empno) cnt,
  5            rank() over (order by count(e.empno) desc) rnk  --> rank them DESC
  6     from emp e join dept d on e.deptno = d.deptno
  7     where d.deptno in (10, 20)
  8     group by d.dname, d.deptno
  9    )
 10  select t.deptno, t.dname, t.cnt
 11  from tcnt t
 12  where rnk = 1;           --> fetch only row(s) with highest rank

    DEPTNO DNAME                 CNT
---------- -------------- ----------
        20 RESEARCH                5

SQL>

Наконец, добавьте еще несколько столбцов из других таблиц:

SQL> with tcnt as
  2    (select d.deptno,
  3            d.dname,
  4            count(e.empno) cnt,
  5            rank() over (order by count(e.empno) desc) rnk
  6     from emp e join dept d on e.deptno = d.deptno
  7     where d.deptno in (10, 20)
  8     group by d.dname, d.deptno
  9    )
 10  select t.deptno, t.dname, t.cnt, e.ename, e.job
 11  from tcnt t join emp e on e.deptno = t.deptno
 12  where rnk = 1;

    DEPTNO DNAME                 CNT ENAME      JOB
---------- -------------- ---------- ---------- ---------
        20 RESEARCH                5 SMITH      CLERK
        20 RESEARCH                5 JONES      MANAGER
        20 RESEARCH                5 SCOTT      ANALYST
        20 RESEARCH                5 ADAMS      CLERK
        20 RESEARCH                5 FORD       ANALYST

SQL>
0 голосов
/ 08 мая 2020

На основе ваших таблиц найдите максимальное количество триплетов, которые сделал водитель (в данном случае водитель с номером лицензии 10002:

Select a.tripno, max(a.trips)
From
(Select Trip.T# as tripno, count(tripleg.leg#) as trips
From tripleg join trip on tripleg.T# = trip.T#
where trip.L# = 10002
Group by tripno
) a
Group by a.tripno
...