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

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

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


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

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

ну а какие у вас быи идеи для решения?
...
Рейтинг: 0 / 0
запрос к бд задача
    #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
запрос к бд задача
    #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
запрос к бд задача
    #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
запрос к бд задача
    #40097679
polignomt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
felix_ff,
не очень понятно, как данные о сотрудниках соединять в конце, если мне нужно по разному для каждого сортировать?
...
Рейтинг: 0 / 0
запрос к бд задача
    #40097690
godsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
polignomt,

получите 2 шт [employee_id] из таблицы Выдачи книг и соедините их с таблицей сотрудников
...
Рейтинг: 0 / 0
запрос к бд задача
    #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
запрос к бд задача
    #40097849
godsql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
polignomt,

неверно.
у вас д.б. два различных запроса. один - находит мах, другой - min.
т.е.
1) посчитать count (dist № читательского билета) для ID выдавшего сотрудника
2) найти мах и min
3) соединить с Сотрудники по ID выдавшего сотрудника
...
Рейтинг: 0 / 0
запрос к бд задача
    #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
запрос к бд задача
    #40097860
Alex_Va
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
polignomt,

А если несколько сотрудников выдали одинаковое наибольшее (наименьшее) количество книг.
Что запрос должен вернуть в таком случае?
...
Рейтинг: 0 / 0
запрос к бд задача
    #40097864
polignomt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alex_Va,
Думаю должен вернуть их всех, но, вероятно, надо тогда их как то разделить.
...
Рейтинг: 0 / 0
запрос к бд задача
    #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
запрос к бд задача
    #40097889
polignomt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
godsql,
спасибо! : )
...
Рейтинг: 0 / 0
запрос к бд задача
    #40097930
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
polignomt
Alex_Va,
Думаю должен вернуть их всех, но, вероятно, надо тогда их как то разделить.


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

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


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