Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / запрос к бд задача / 15 сообщений из 15, страница 1 из 1
14.09.2021, 19:56
    #40097656
polignomt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос к бд задача
Есть БД библиотека. Вот несколько таблиц из нее:
Выдачи книг:
- ID экземпляра
- Дата выдачи
- Дата возврата
- № читательского билета
- ID выдавшего сотрудника

Сотрудники:
- ID сотрудника
- Имя
- Фамилия
- Год рождения
Необходимо найти сотрудника, выдавшего книги наибольшему и наименьшему количеству различных читателей. Формулировка мутноватая, но мне кажется надо вывести обоих. Не очень понимаю, как различных именно читателей выделить тут было бы оптимально.
...
Рейтинг: 0 / 0
14.09.2021, 20:15
    #40097660
felix_ff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос к бд задача
Необходимо найти сотрудника, выдавшего книги наибольшему и наименьшему

polignomt
. Формулировка мутноватая, но мне кажется надо вывести обоих.


кэп одобряет, вы движетесь в правильном направлении.

Не очень понимаю, как различных именно читателей выделить тут было бы оптимально.

ну а какие у вас быи идеи для решения?
...
Рейтинг: 0 / 0
14.09.2021, 20:31
    #40097664
polignomt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос к бд задача
felix_ff,
SELECT TOP 1 name[имя], sec_name[фамилия] FROM (SELECT name, sec_name,COUNT(DISTINCT num_card[номер читательского]) AS unic_ID, FROM book_out[таблица с экземплярами] INNER JOIN stuff[таблица с сотрудниками] ON book_out.stuff_ID = stuff.stuff_ID GROUP BY name, sec_name ORDER BY COUNT(DISTINCT num_card) DESC )
UNION
SELECT TOP 1 name, sec_name FROM table FROM (SELECT name, sec_name,COUNT(DISTINCT num_card) AS unic_ID, FROM book_out INNER JOIN stuff ON book_out.stuff_ID = stuff.stuff_ID GROUP BY name, sec_name ORDER BY COUNT(DISTINCT num_card) ASC )
...
Рейтинг: 0 / 0
14.09.2021, 20:45
    #40097667
felix_ff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос к бд задача
polignomt
felix_ff,
SELECT TOP 1 name[имя], sec_name[фамилия] FROM (SELECT name, sec_name,COUNT(DISTINCT num_card[номер читательского]) AS unic_ID, FROM book_out[таблица с экземплярами] INNER JOIN stuff[таблица с сотрудниками] ON book_out.stuff_ID = stuff.stuff_ID GROUP BY name, sec_name ORDER BY COUNT(DISTINCT num_card) DESC )
UNION
SELECT TOP 1 name, sec_name FROM table FROM (SELECT name, sec_name,COUNT(DISTINCT num_card) AS unic_ID, FROM book_out INNER JOIN stuff ON book_out.stuff_ID = stuff.stuff_ID GROUP BY name, sec_name ORDER BY COUNT(DISTINCT num_card) ASC )


пока все плохо. вы видите что ваш синтаксис не валидный и даже не выполнится на сервере?
...
Рейтинг: 0 / 0
14.09.2021, 20:53
    #40097668
felix_ff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос к бд задача
polignomt,

я дам вам небольшой вектор, подумайте над данным запросом

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
declare @out table (
    [id] int identity(1,1),
    [ticket] int,
    [employee_id] int
);

insert into @out values (1, 100), (1, 100), (2, 100), (3, 100), (1, 100), (5, 100),
(1, 200), (3,200), (3, 200), (5,200),
(1, 100), (5, 300), (5, 300), (5, 300), (3, 300), (5, 300), (1, 300);

select * from @out order by employee_id

select count(1) as [all_tickets], count(distinct ticket) as [distinct_tickets],[employee_id] from @out group by [employee_id]



вы должны оперировать из поставленной задачи таблицей выдач, непосредственно данные о сотруднике вы соедините в конце.
...
Рейтинг: 0 / 0
14.09.2021, 22:20
    #40097679
polignomt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос к бд задача
felix_ff,
не очень понятно, как данные о сотрудниках соединять в конце, если мне нужно по разному для каждого сортировать?
...
Рейтинг: 0 / 0
14.09.2021, 22:38
    #40097690
godsql
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос к бд задача
polignomt,

получите 2 шт [employee_id] из таблицы Выдачи книг и соедините их с таблицей сотрудников
...
Рейтинг: 0 / 0
15.09.2021, 16:20
    #40097833
polignomt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос к бд задача
godsql,
приходит в голову только такое, но проверить, адекватно ли это негде, а в голове компилировать тоже сомнительно, тк я занимаюсь sql очень недавно(

WITH table AS (
SELECT MAX(num) AS first, MIN(num) AS second FROM
(SELECT COUNT(* ) as num , ID_stuff FROM (SELECT DISTINCT ID_stuff, num_card FROM books_out GROUP BY ID_stuff) ORDER BY COUNT (*) DESC) )
SELECT name FROM staff INNER JOIN table ON stuff.ID_stuff = table.ID_stuff
...
Рейтинг: 0 / 0
15.09.2021, 16:50
    #40097849
godsql
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос к бд задача
polignomt,

неверно.
у вас д.б. два различных запроса. один - находит мах, другой - min.
т.е.
1) посчитать count (dist № читательского билета) для ID выдавшего сотрудника
2) найти мах и min
3) соединить с Сотрудники по ID выдавшего сотрудника
...
Рейтинг: 0 / 0
15.09.2021, 17:10
    #40097853
polignomt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос к бд задача
godsql, правильно ли я понимаю, что вы это имеетее в виду?

WITH table AS (
SELECT ID_stuff, COUNT(DISTINCT num_card[№ чит.билета] ) FROM books_out GROUP BY ID_stuff HAVING COUNT(DISTINCT num_card) = (SELECT MAX(COUNT(DISTINCT num_card)))
UNION
SELECT ID_stuff, COUNT(DISTINCT num_card[№ чит.билета] ) FROM books_out GROUP BY ID_stuff HAVING COUNT(DISTINCT num_card) = (SELECT MIN(COUNT(DISTINCT num_card)))
)
SELECT name FROM staff INNER JOIN table ON stuff.ID_stuff = table.ID_stuff
...
Рейтинг: 0 / 0
15.09.2021, 17:52
    #40097860
Alex_Va
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос к бд задача
polignomt,

А если несколько сотрудников выдали одинаковое наибольшее (наименьшее) количество книг.
Что запрос должен вернуть в таком случае?
...
Рейтинг: 0 / 0
15.09.2021, 18:02
    #40097864
polignomt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос к бд задача
Alex_Va,
Думаю должен вернуть их всех, но, вероятно, надо тогда их как то разделить.
...
Рейтинг: 0 / 0
15.09.2021, 18:41
    #40097869
godsql
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос к бд задача
polignomt
godsql, правильно ли я понимаю, что вы это имеетее в виду?

WITH table AS (
SELECT ID_stuff, COUNT(DISTINCT num_card[№ чит.билета] ) FROM books_out GROUP BY ID_stuff HAVING COUNT(DISTINCT num_card) = (SELECT MAX(COUNT(DISTINCT num_card)))
UNION
SELECT ID_stuff, COUNT(DISTINCT num_card[№ чит.билета] ) FROM books_out GROUP BY ID_stuff HAVING COUNT(DISTINCT num_card) = (SELECT MIN(COUNT(DISTINCT num_card)))
)
SELECT name FROM staff INNER JOIN table ON stuff.ID_stuff = table.ID_stuff


немножко не так
проще всего
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
WITH table AS (
SELECT ID_stuff, COUNT(DISTINCT num_card[№ чит.билета] ) as cnt FROM books_out GROUP BY ID_stuff 
)
SELECT name FROM staff INNER  JOIN 
(select top 1 with ties  ID_stuff from table order by cnt desc
union
select top 1 with ties ID_stuff from table order by cnt 
) table1
 ON stuff.ID_stuff = table1.ID_stuff
...
Рейтинг: 0 / 0
15.09.2021, 20:24
    #40097889
polignomt
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос к бд задача
godsql,
спасибо! : )
...
Рейтинг: 0 / 0
16.09.2021, 08:13
    #40097930
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
запрос к бд задача
polignomt
Alex_Va,
Думаю должен вернуть их всех, но, вероятно, надо тогда их как то разделить.


Вы написали "надо тогда их как то разделить", т.е. как что "то"?

"как то" и "как-то" имеют совершенно разные значения.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / запрос к бд задача / 15 сообщений из 15, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]