Форум программистов, компьютерный форум, киберфорум
PostgreSQL
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
1 / 1 / 0
Регистрация: 10.01.2016
Сообщений: 9
1

Как совместить две агрегатные функции в одном запросе

15.06.2016, 20:56. Показов 1613. Ответов 7
Метки нет (Все метки)

Доброго времени суток!
Есть следующий запрос:

SQL
1
2
3
4
SELECT fio, COUNT(inq_id) AS quantity, sys_name
FROM ((employees JOIN systems ON tabnum=admin)JOIN users ON systems.sys
_id=users.sys_id) JOIN inquiries ON users.user_id=inquiries.user_id
GROUP BY sys_name, fio
Результат выполнения данного запроса следующий:
fio | quantity | sys_name
----------------------------------------+----------+------------------------
Сметанин Анатолий Андреевич___| 3 | А
Никандров Сергей Сергеевич____ | 4 | Б
Старов Степан Петрович_________| 6 | В
Берестовой Юрий Александрович_| 5 | Г
Берестовой Юрий Александрович_| 3 | Д
Старов Степан Петрович_________| 3 | Е
Берестовой Юрий Александрович_| 4 | Ж
Берестовой Юрий Александрович_| 1 | З
Никандров Сергей Сергеевич_____| 1 | И
(9 строк)

Пытаюсь данный запрос изменить таким образом, чтобы он выводил только строки с наименьшим quantity то есть впихнуть в запрос еще одну функцию - min. А как это правильно сделать, ума не приложу =( Help!!!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.06.2016, 20:56
Ответы с готовыми решениями:

Как соединить в одном запросе JOIN и множество подзапросов
Здравствуйте, есть таблица, скажем так каталог автомобилей. В этой таблице большинство столбцов...

Как совместить в одном запросе комбобокс и радиобатн
Всем доброго времени суток! Помогите новичку! Решила заняться саморазвитием, в универе изучала С++,...

Не получается в запросе использовать агрегатные функции
Единомышленники, всем привет! Опять столкнулся по кривому с агрегатными функциями, не получается в...

Две задачи совместить в одном документе,чтобы работали
В этом файле заменить первую задачу на вот эту

__________________
7
1035 / 812 / 318
Регистрация: 02.09.2012
Сообщений: 2,479
16.06.2016, 00:08 2
не переделывая внутреннюю часть запроса
SQL
1
2
3
4
5
SELECT fio, quantity, sys_name
FROM
(SELECT fio, sys_name, quantity, MIN(quantity) OVER (partition BY fio) min_q
FROM (здесь исходный запрос)AS a) AS b
WHERE quantity = min_q
план всего запроса будет ужасным.
подсчет минимальности можно засунуть и в исходный запрос, только нужно понимать все приведенное множество join'ов, чтобы оптимально выстроить запрос.
0
1 / 1 / 0
Регистрация: 10.01.2016
Сообщений: 9
16.06.2016, 04:24  [ТС] 3
Структура у базы следующая (см. вложение)
0
Вложения
Тип файла: rar база.rar (9.0 Кб, 10 просмотров)
1035 / 812 / 318
Регистрация: 02.09.2012
Сообщений: 2,479
16.06.2016, 12:22 4
вроде так, но надо проверять на ваших данных
SQL
1
2
3
4
5
6
7
8
9
10
11
12
WITH
admins AS
 (SELECT u.user_id, e.fio, s.sys_name
 FROM systems s, employees e, users u WHERE s.admin = e.tabnum AND e.tabnum = u.tabnum),
qstat AS
 (SELECT adm.fio, adm.sys_name, COUNT(q.inq_id) AS qcnt
 FROM admins adm, inquiries q WHERE adm.user_id = q.user_id
 GROUP BY adm.fio, adm.sys_name)
SELECT fio, sys_name, q1.qcnt
FROM qstat q1
WHERE qcnt = (SELECT MIN(qcnt) FROM qstat q2 WHERE q2.admin=q1.admin)
ORDER BY fio;
1
1 / 1 / 0
Регистрация: 10.01.2016
Сообщений: 9
16.06.2016, 18:04  [ТС] 5
Ругается на 11 строку :
"ОШИБКА: колонка q2.admin не существует
СТРОКА 11: ...HERE qcnt = (SELECT MIN(qcnt) FROM qstat q2 WHERE q2.admin=q..."
^

Добавлено через 58 минут
Все, разобралась! =)


SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
WITH
admins AS
 (SELECT DISTINCT s.sys_id, e.fio, s.sys_name
 FROM systems s, employees e, users u WHERE s.admin = e.tabnum AND s.sys_id = u.sys_id),
qstat AS
 (SELECT adm.fio, adm.sys_name, COUNT(q.inq_id) AS qcnt
 FROM admins adm, inquiries q, users u WHERE adm.sys_id = u.sys_id AND u.user_id=q.user_id
 GROUP BY adm.fio, adm.sys_name)
SELECT fio
FROM qstat
WHERE qcnt = (SELECT MIN(qcnt) FROM qstat)
GROUP BY  fio
ORDER BY fio;

Огромное спасибо за помощь!
0
1035 / 812 / 318
Регистрация: 02.09.2012
Сообщений: 2,479
17.06.2016, 13:40 6
Еще раз перечитал задание запроса... да, ваш вариант более близок к правде, я неверно понял запрос в первый раз

Но, не придирки ради...
Можно убрать users из admins - все равно в выборке она не участвует, заодно и DISTINCT не нужен будет.
И group by fio в конце - тоже никакого смысла нет.
0
1 / 1 / 0
Регистрация: 10.01.2016
Сообщений: 9
20.06.2016, 20:31  [ТС] 7
С замечаниями согласна!
Появился еще один вопрос, как вывести системы, по которым не было запросов. У меня не получилось заставить count выводить количество пустых строк.
0
1035 / 812 / 318
Регистрация: 02.09.2012
Сообщений: 2,479
21.06.2016, 00:22 8
можно так, посчитать для каждой системы кол-во запросов, отфильтровать только системы с нулевым кол-вом.
SQL
1
2
3
4
5
6
7
8
9
10
11
12
SELECT
  s.sys_name,
  COUNT(q.inq_id)
FROM
  systems s,
  users u,
  inquiries q
WHERE
  s.sys_id = u.sys_id AND u.user_id = q.user_id
GROUP BY
  s.sys_name
HAVING COUNT(q.inq_id) = 0;
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.06.2016, 00:22

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Как вывести две колонки из двух разных таблиц в одном запросе?
Как вывести две колонки из двух разных таблиц в одном запросе, при этом колонки должны выводится...

Две таблицы из разных БД в одном запросе
Вообщем как это можно организовать??? Не хотелось просто что бы одинаковые поля были в двух...

Соединить две таблицы в одном запросе
Первый запрос: SELECT * FROM sd_flats_short as f LEFT JOIN (SELECT product_id, category, count(id)...

Вывести две таблицы в одном запросе
помогите нужно вывести 2 таблицы в одном запросе . к примеру таблица а и б .. помоги сформировать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.