SQL-запрос для отображения минимального среднего значения вместе с заголовком с использованием двух таблиц - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть две таблицы:

huffman_students (
id (PK),
fname,
lname,
status ("freshman", "sophomore", "junior", "senior"),
majorcode (FK - huffman_departments.deptcode),
gpa,
admittedDate)

huffman_departments (
deptcode (PK),
deptname,
college)

Мне нужно показать колледжу самый низкий средний средний балл.

Мне удалось задать этот запрос:

SELECT MIN(avg_gpa)
FROM
(
SELECT d.college, AVG(s.gpa)
FROM huffman_departments d, huffman_students s
WHERE s.majorcode = d.deptcode
GROUP BY d.college
);

Что дает вывод:

MIN(AVG_GPA)
------------
       3.436

Мне нужен вывод, который выглядит следующим образом:

COLLEGE    MIN(AVG_GPA)
-----------------------
INF               3.436

Я пробовал много разных запросов и продолжаю получать ошибки.Распространенная ошибка, которую я получаю, когда пытаюсь показать колледжу, к которому принадлежит самый низкий средний показатель gpa: «не групповая функция одной группы».

Я использую Oracle SQL Plus.

Ответы [ 4 ]

0 голосов
/ 21 февраля 2019

Используя то, что у вас уже есть:

SELECT b.*
FROM  (SELECT d.college, AVG(s.gpa) avg_gpa
FROM huffman_departments d, huffman_students s
WHERE s.majorcode = d.deptcode
GROUP BY d.college
) b
WHERE b.avg_gpa = (SELECT MIN(a.avg_gpa)
FROM
(
SELECT d.college, AVG(s.gpa) avg_gpa
FROM huffman_departments d, huffman_students s
WHERE s.majorcode = d.deptcode
GROUP BY d.college
) a);
0 голосов
/ 21 февраля 2019

Вы можете использовать общие табличные выражения

with cte0 as 
(
  SELECT d.college, AVG(s.gpa) agpa
  FROM huffman_departments d, huffman_students s
  WHERE s.majorcode = d.deptcode
  GROUP BY d.college
)
select * from cte0  c
where c.college (
  select ci.college from cte0 ci
  group by ci.college 
  having min(ci.agpa) = a.gpa
)

, если вы используете mysql

SELECT d.college, AVG(s.gpa)
FROM huffman_departments d, huffman_students s
WHERE s.majorcode = d.deptcode
GROUP BY d.college
order by 2 asc
limit 1
0 голосов
/ 21 февраля 2019

Никогда не используйте запятые в предложении FROM. Всегда используйте правильный, явный, стандартный JOIN синтаксис.

Если вы ищете одну строку, вы можете использовать ORDER BY и FETCH FIRST 1 ROW ONLY:

SELECT d.college, AVG(s.gpa)
FROM huffman_departments d JOIN
     huffman_students s
     ON s.majorcode = d.deptcode
GROUP BY d.college
ORDER BY AVG(s.gpa)
FETCH FIRST 1 ROW ONLY;

Если вы хотите увидеть несколько строк в случае связей, существует несколько подходов.В MySQL 8+ оконные функции, вероятно, самый простой метод.В более ранних версиях двойное агрегирование может быть самым простым:

SELECT avg_gpa, LISTAGG(college, ',') WITHIN GROUP (ORDER BY college) as colleges
FROM (SELECT d.college, AVG(s.gpa) as avg_gpa
      FROM huffman_departments d JOIN
           huffman_students s
           ON s.majorcode = d.deptcode
      GROUP BY d.college
     ) c
ORDER BY avg_gpa
FETCH FIRST 1 ROW ONLY;

РЕДАКТИРОВАТЬ:

Более старые версии Oracle не поддерживают FETCH FIRST.Так что вы можете сделать:

SELECT college, avg_gpa
FROM (SELECT d.college, AVG(s.gpa) as avg_gpa,
             ROW_NUMBER() OVER (ORDER BY AVG(s.gpa)) as seqnum
      FROM huffman_departments d JOIN
           huffman_students s
           ON s.majorcode = d.deptcode
      GROUP BY d.college
     ) c
WHERE seqnum = 1
ORDER BY AVG(s.gpa);
0 голосов
/ 21 февраля 2019

Вы можете переместить существующий запрос в подзапрос (или CTE), а затем использовать аналитическую функцию ROW_NUMBER для фильтрации соответствующей записи:

WITH cte AS (
    SELECT d.college, AVG(s.gpa) avg_spa
    FROM 
        huffman_departments d
        INNER JOIN huffman_students s ON s.majorcode = d.deptcode
    GROUP BY d.college
)
SELECT *
FROM (
    SELECT c.*, ROW_NUMBER() OVER(ORDER BY avg_spa) rn
    FROM cte c
) x WHERE rn = 1

PS: всегда использовать явные соединения вместо неявных (CROSSПрисоединиться + предложение WHERE).Я изменил запрос соответственно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...