Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 запрос к бд задача  [new]
polignomt
Member

Откуда:
Сообщений: 10
Есть БД библиотека. Вот несколько таблиц из нее:
Выдачи книг:
- ID экземпляра
- Дата выдачи
- Дата возврата
- № читательского билета
- ID выдавшего сотрудника

Сотрудники:
- ID сотрудника
- Имя
- Фамилия
- Год рождения
Необходимо найти сотрудника, выдавшего книги наибольшему и наименьшему количеству различных читателей. Формулировка мутноватая, но мне кажется надо вывести обоих. Не очень понимаю, как различных именно читателей выделить тут было бы оптимально.
14 сен 21, 19:56    [22371894]     Ответить | Цитировать Сообщить модератору
 Re: запрос к бд задача  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1873
Необходимо найти сотрудника, выдавшего книги наибольшему и наименьшему

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


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

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

ну а какие у вас быи идеи для решения?
14 сен 21, 20:15    [22371899]     Ответить | Цитировать Сообщить модератору
 Re: запрос к бд задача  [new]
polignomt
Member

Откуда:
Сообщений: 10
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 )
14 сен 21, 20:31    [22371904]     Ответить | Цитировать Сообщить модератору
 Re: запрос к бд задача  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1873
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 )


пока все плохо. вы видите что ваш синтаксис не валидный и даже не выполнится на сервере?
14 сен 21, 20:45    [22371909]     Ответить | Цитировать Сообщить модератору
 Re: запрос к бд задача  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1873
polignomt,

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

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]


вы должны оперировать из поставленной задачи таблицей выдач, непосредственно данные о сотруднике вы соедините в конце.
14 сен 21, 20:53    [22371910]     Ответить | Цитировать Сообщить модератору
 Re: запрос к бд задача  [new]
polignomt
Member

Откуда:
Сообщений: 10
felix_ff,
не очень понятно, как данные о сотрудниках соединять в конце, если мне нужно по разному для каждого сортировать?
14 сен 21, 22:20    [22371934]     Ответить | Цитировать Сообщить модератору
 Re: запрос к бд задача  [new]
godsql
Member

Откуда:
Сообщений: 234
polignomt,

получите 2 шт [employee_id] из таблицы Выдачи книг и соедините их с таблицей сотрудников
14 сен 21, 22:38    [22371948]     Ответить | Цитировать Сообщить модератору
 Re: запрос к бд задача  [new]
polignomt
Member

Откуда:
Сообщений: 10
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
15 сен 21, 16:20    [22372157]     Ответить | Цитировать Сообщить модератору
 Re: запрос к бд задача  [new]
godsql
Member

Откуда:
Сообщений: 234
polignomt,

неверно.
у вас д.б. два различных запроса. один - находит мах, другой - min.
т.е.
1) посчитать count (dist № читательского билета) для ID выдавшего сотрудника
2) найти мах и min
3) соединить с Сотрудники по ID выдавшего сотрудника
15 сен 21, 16:50    [22372178]     Ответить | Цитировать Сообщить модератору
 Re: запрос к бд задача  [new]
polignomt
Member

Откуда:
Сообщений: 10
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
15 сен 21, 17:10    [22372189]     Ответить | Цитировать Сообщить модератору
 Re: запрос к бд задача  [new]
Alex_Va
Member

Откуда:
Сообщений: 30
polignomt,

А если несколько сотрудников выдали одинаковое наибольшее (наименьшее) количество книг.
Что запрос должен вернуть в таком случае?
15 сен 21, 17:52    [22372198]     Ответить | Цитировать Сообщить модератору
 Re: запрос к бд задача  [new]
polignomt
Member

Откуда:
Сообщений: 10
Alex_Va,
Думаю должен вернуть их всех, но, вероятно, надо тогда их как то разделить.
15 сен 21, 18:02    [22372202]     Ответить | Цитировать Сообщить модератору
 Re: запрос к бд задача  [new]
godsql
Member

Откуда:
Сообщений: 234
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


немножко не так
проще всего
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


Сообщение было отредактировано: 15 сен 21, 18:40
15 сен 21, 18:41    [22372209]     Ответить | Цитировать Сообщить модератору
 Re: запрос к бд задача  [new]
polignomt
Member

Откуда:
Сообщений: 10
godsql,
спасибо! : )
15 сен 21, 20:24    [22372244]     Ответить | Цитировать Сообщить модератору
 Re: запрос к бд задача  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 4232
polignomt
Alex_Va,
Думаю должен вернуть их всех, но, вероятно, надо тогда их как то разделить.


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

"как то" и "как-то" имеют совершенно разные значения.
16 сен 21, 08:13    [22372357]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить