powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите написать запрос
6 сообщений из 6, страница 1 из 1
Помогите написать запрос
    #40089768
Фотография Roust_m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день,

Есть таблица из двух столбцов: Role и Qualification. К примеру
Role, Qualification
охранник, лицензия на охрану без собаки
охранник, сертификат оказания первой помощи
старший охранник, лицензия на охрану без собаки
старший охранник, лицензия на ношение оружия
старший охранник, лицензия на охрану с собакой
старший охранник, , сертификат оказания первой помощи
сторож, лицензия на охрану без собаки
сторож, сертификат оказания первой помощи
...

Надо найти роли с одинаковыми квалификациями с целью их последующего слияния.

Спасибо.
...
Рейтинг: 0 / 0
Помогите написать запрос
    #40089772
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roust_m
Надо найти роли с одинаковыми квалификациями

Что имеется в виду?

Две роли, имеющие хотя бы одну общую квалификацию?
Две роли, где все квалификации первой входят в список квалификаций второй?
Две роли с полностью идентичным набором квалификаций?
...
Рейтинг: 0 / 0
Помогите написать запрос
    #40089783
Фотография Roust_m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina
Roust_m
Надо найти роли с одинаковыми квалификациями

Что имеется в виду?

Две роли, имеющие хотя бы одну общую квалификацию?
Две роли, где все квалификации первой входят в список квалификаций второй?
Две роли с полностью идентичным набором квалификаций?


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

Код: sql
1.
2.
3.
select *
  from [Есть таблица из двух столбцов] a
 where exists(select * from[Есть таблица из двух столбцов] b where b.Qualification = a.Qualification and b.role != a.role)
...
Рейтинг: 0 / 0
Помогите написать запрос
    #40089805
remi_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если таблица не очень большая, то

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
declare @Tab table(Role varchar(255), Qualification varchar(255))

insert into @Tab(Role, Qualification) values
('охранник', 'лицензия на охрану без собаки'),
('охранник', 'сертификат оказания первой помощи'),
('старший охранник', 'лицензия на охрану без собаки'),
('старший охранник', 'лицензия на ношение оружия'),
('старший охранник', 'лицензия на охрану с собакой'),
('старший охранник', 'сертификат оказания первой помощи'),
('сторож', 'лицензия на охрану без собаки'),
('сторож', 'сертификат оказания первой помощи')

;with asdf as (
select Role1=t1.Role, Role2=t2.Role, t1.Qualification
from @Tab t1
join @Tab t2 on t2.Role > t1.Role
	and t2.Qualification=t1.Qualification
), qwer as (
	select distinct Qualification from asdf
)
select distinct a.Role1, a.Role2 
from asdf a
where NOT exists(select 1 from @Tab tt where tt.Role in (a.Role1, a.Role2) and tt.Qualification NOT in (select Qualification from qwer))
...
Рейтинг: 0 / 0
Помогите написать запрос
    #40089813
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну как-то так...
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
WITH cte AS ( SELECT Role, 
                     STRING_AGG(Qualification, ',') WITHIN GROUP (ORDER BY Qualification) QualificationsList
              FROM src_table
              GROUP BY Role)
SELECT STRING_AGG(Role, ',') IdenticalRoles
FROM cte
GROUP BY QualificationsList
HAVING COUNT(*) > 1


https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=5ad1f5d7da7666c236a3320e24198c5d

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


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