powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помощь в написании запроса
6 сообщений из 6, страница 1 из 1
Помощь в написании запроса
    #39681438
assmsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.
Есть таблица с id сотрудника и его навыками(скиллами).
Нужно написать запрос который по каждому сотруднику выводит кол-во других сотрудников у которых есть такие же навыки как у него.

create table #x ( id_user int , skill varchar(255) )
Insert #x
select 1,'a' union all
select 1,'b' union all
select 1,'c' union all
select 2,'a' union all
select 2,'b' union all
select 2,'c' union all
select 3,'x' union all
select 4,'a' union all
select 4,'b' union all
select 4,'c' union all
select 4,'h' union all
select 5,'h'



Результат :
1 - 2
2 - 2
3 - 0
4 - 0
5 - 1

т.е
у сотрудника с id 1 скиллы a,b,с , такие скиллы есть у сотрудников 2 и 4 = 2
у сотрудника с id 2 скиллы a,b,с , такие скиллы есть у сотрудников 1 и 4 = 2
у сотрудника с id 3 скилл х , такого скилла ни у кого нет = 0
у сотрудника с id 4 скиллы a,b,с,h , такого набора ни у кого нет = 0
у сотрудника с id 5 скилл h , такой есть у сотрудника 4 = 1


Вроде бы должно быть не сложно, но что то я запутался как написать
...
Рейтинг: 0 / 0
Помощь в написании запроса
    #39681444
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Объедини 2 копии таблицы по user1<>user2 и skill1=skill2. Сгруппируй по (user1,user2), посчитай количество записей count12 для пары. Отдельно посчитай количество count1 скиллов user1. Оставь только те пары, где count1=count12. Сгруппируй по user1 и посчитай count. Всё.
...
Рейтинг: 0 / 0
Помощь в написании запроса
    #39681453
Kopelly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
declare @x table ( id_user int , skill varchar(255) )
 Insert @x
 select 1,'a' union all
 select 1,'b' union all
 select 1,'c' union all
 select 2,'a' union all
 select 2,'b' union all
 select 2,'c' union all
 select 3,'x' union all
 select 4,'a' union all
 select 4,'b' union all
 select 4,'c' union all
 select 4,'h' union all
 select 5,'h';

With cte as (
Select a.id_user, a.skill, b.id_user as Other_User
From  @x a
left join @x b on a.id_user <> b.id_user and a.skill = b.skill)

Select users.id_user,count(others.Other_User)
 From (Select id_user, count(distinct skill) as Skills From cte Group by id_user) users
 left join (Select id_user, Other_User, count(distinct skill) as Skills From cte Group by id_user, Other_User) others 
   on users.id_user = Others.id_user and users.Skills = Others.Skills
 Group by users.id_user
...
Рейтинг: 0 / 0
Помощь в написании запроса
    #39681457
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
assmsk,

реляционное деление.
...
Рейтинг: 0 / 0
Помощь в написании запроса
    #39681459
Kopelly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для ускорения можно, по результату идентично:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
declare @x table ( id_user int , skill varchar(255) )
 Insert @x
 select 1,'a' union all
 select 1,'b' union all
 select 1,'c' union all
 select 2,'a' union all
 select 2,'b' union all
 select 2,'c' union all
 select 3,'x' union all
 select 4,'a' union all
 select 4,'b' union all
 select 4,'c' union all
 select 4,'h' union all
 select 5,'h';

With cte as (
Select a.id_user, a.skill, b.id_user as Other_User
From  @x a
left join @x b on a.id_user <> b.id_user and a.skill = b.skill)

Select users.id_user,count(others.Other_User)
 From (Select id_user, count(distinct skill) as Skills From @x Group by id_user) users
 left join (Select id_user, Other_User, count(distinct skill) as Skills From cte Group by id_user, Other_User) others 
   on users.id_user = Others.id_user and users.Skills = Others.Skills
 Group by users.id_user



Данный запрос будет корректно работать даже при повторах навыков по юзеру.
...
Рейтинг: 0 / 0
Помощь в написании запроса
    #39684502
Naomin papa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Щукина Аннаassmsk,

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


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