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

Откуда:
Сообщений: 3
Задание 1
Есть несколько человек.
Каждый из них может говорить на одном или нескольких языках.
Человек Знание языков
Anna French, German
Bill Chinese, Italian, Spanish
Ivan Chinese
Max English, French
Olga German, Japanese
Piter English, Russian
Sam Italian, Portuguese

Нужно разбить этих людей на группы, между которыми НЕвозможно общение.
С учетом того, что можно общаться с несколькими переводчиками.
Например, Piter может пообщаться с Olga так: Piter – English - Max – French - Anna – German - Olga
Результат представить в таком виде:
Группа Участники Языки
1 Anna, Max, Olga, Piter English, French, German, Japanese, Russian
2 Bill, Ivan, Sam Chinese, Italian, Portuguese, Spanish

Выполнить с помощью sql запроса (без использования процедур временных таблиц и переменных). CTE использовать разрешается.

Задание 2
В компании есть несколько отделов, в каждом из них работают несколько менеджеров.
Есть информация о зарплате (окладе) каждого менеджера, и количестве договоров, заключенных менеджером за месяц.
Отдел Менеджер Оклад Количество заключенных договоров за месяц
Department 1 Manager 1 500 7
Department 1 Manager 2 500 9
Department 1 Manager 3 700 2
Department 1 Manager 4 700 8
Department 1 Manager 5 500 7
Department 1 Manager 6 600 4
Department 2 Manager 13 600 9
Department 2 Manager 14 700 3
Department 2 Manager 15 700 6
Department 2 Manager 16 500 2
Department 2 Manager 26 700 2
Department 3 Manager 16 500 3
Department 3 Manager 17 600 1
Department 3 Manager 18 600 7
Department 3 Manager 19 600 7
Department 3 Manager 20 600 9


Необходимо рассчитать премии менеджерам по следующему алгоритму:
- если в среднем по отделу заключено 5 или более договоров на одного менеджера, то в отделе всем, начисляется премия 20% от оклада.
- Кроме того, премия 10% начисляется сотруднику заключившему наибольшее количество договоров в компании. Если таких несколько, то всем по 10 %.
Результат вывести в следующем виде (см. примечания к таблице).
Отдел Менеджер Количество договоров Сумма бонуса
86 1450

Department 1 Manager 02 9 150
Department 2 Manager 13 9 60

Department 3 Manager 20 9 180
Department 1 37 750

Department 1 Manager 01 7 100

Department 1 Manager 02 9 150
Department 1 Manager 03 2 140
Department 1 Manager 04 8 140
Department 1 Manager 05 7 100
Department 1 Manager 06 4 120
Department 2 22 60

Department 2 Manager 13 9 60
Department 2 Manager 14 3 0
Department 2 Manager 15 6 0
Department 2 Manager 16 2 0
Department 2 Manager 26 2 0
Department 3 27 640
Department 3 Manager 16 3 100
Department 3 Manager 17 1 120
Department 3 Manager 18 7 120
Department 3 Manager 19 7 120
Department 3 Manager 20 9 180

Порядок строк важен.
Результат сформировать sql запросом используя grouping sets без использования union.

К сообщению приложен файл (Задание1.docx - 14Kb) cкачать

Сообщение было отредактировано: 11 июн 21, 09:21
11 июн 21, 09:28    [22334176]     Ответить | Цитировать Сообщить модератору
 Re: Задание на собеседовании [Помогите]  [new]
mixail08
Member

Откуда:
Сообщений: 3
Неполный файл приложился

К сообщению приложен файл (Задания.docx - 23Kb) cкачать
11 июн 21, 09:30    [22334177]     Ответить | Цитировать Сообщить модератору
 Re: Задание на собеседовании [Помогите]  [new]
felix_ff
Member

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

а где ваши идеи/нароботки выполнения задания?
11 июн 21, 10:47    [22334231]     Ответить | Цитировать Сообщить модератору
 Re: Задание на собеседовании [Помогите]  [new]
mixail08
Member

Откуда:
Сообщений: 3
felix_ff, понимаю, что задание 1нужно через рекурсию cte делать. но не понимаю как...
11 июн 21, 10:50    [22334234]     Ответить | Цитировать Сообщить модератору
 Re: Задание на собеседовании [Помогите]  [new]
Кесарь
Member

Откуда:
Сообщений: 653
mixail08
felix_ff, понимаю, что задание 1нужно через рекурсию cte делать. но не понимаю как...


А работать за вас мы тоже будем? Вы даже не удосужились подготовить тестовые данные. Не говоря уж о предварительных заготовках и путях решения.
11 июн 21, 11:28    [22334266]     Ответить | Цитировать Сообщить модератору
 Re: Задание на собеседовании [Помогите]  [new]
court
Member

Откуда:
Сообщений: 2335
нуу, 1-ое, ваще интересное :)
+
-- в результате, ещё, нужно "дубли" из перестановок убрать, но вот это уже не интересно :)
declare @t table (name varchar(50), langs varchar(1000))

insert into @t values 
('Anna', 'French,German'),
('Bill', 'Chinese,Italian,Spanish'),
('Ivan', 'Chinese'),
('Max', 'English,French'),
('Olga', 'German,Japanese'),
('Piter', 'English,Russian'),
('Sam', 'Italian,Portuguese')

;with cte as (
	select t.name, t.langs, trim(a.value) as lang  from @t t
	cross apply string_split(t.langs,',') a),
cte1 as (
	select 
		cast(name as varchar(max)) as name
		,cast(langs as varchar(max)) as langs
		,1 as lvl
	from @t t

	union all

	select
		a.name+','+t.name
		,a.langs+','+t.langs
		,a.lvl+1
	from cte1 a inner join @t t on ','+a.name+',' not like '%,'+t.name+',%'
	where not exists (select 1 from cte b where b.name=t.name and ','+a.langs+',' like '%,'+b.lang+',%')
)
select * from cte1 where lvl > 1 order by lvl, name 
11 июн 21, 12:14    [22334302]     Ответить | Цитировать Сообщить модератору
 Re: Задание на собеседовании [Помогите]  [new]
aleks222
Member

Откуда:
Сообщений: 1416
court
нуу, 1-ое, ваще интересное :)

Поиск связного подграфа.
Классика, набившая оскомину.
11 июн 21, 14:38    [22334443]     Ответить | Цитировать Сообщить модератору
 Re: Задание на собеседовании [Помогите]  [new]
court
Member

Откуда:
Сообщений: 2335
aleks222
court
нуу, 1-ое, ваще интересное :)

Поиск связного подграфа.
Классика, набившая оскомину.
втом и дело, что наоборот, - несвязанные "ищуцца" )
11 июн 21, 14:41    [22334446]     Ответить | Цитировать Сообщить модератору
 Re: Задание на собеседовании [Помогите]  [new]
aleks222
Member

Откуда:
Сообщений: 1416
court
aleks222
пропущено...

Поиск связного подграфа.
Классика, набившая оскомину.
втом и дело, что наоборот, - несвязанные "ищуцца" )

Искать можно и пятый угол.
Но если слегка подучиться - можно его не искать.

"Нужно разбить этих людей на группы, между которыми НЕвозможно общение." - это и есть связный подграф.
11 июн 21, 14:47    [22334452]     Ответить | Цитировать Сообщить модератору
 Re: Задание на собеседовании [Помогите]  [new]
court
Member

Откуда:
Сообщений: 2335
aleks222
"Нужно разбить этих людей на группы, между которыми НЕвозможно общение." - это и есть связный подграф.
т.е. связями между вершинами ("человеками") ты предлагаешь считать НЕвозможность их общения ?

ОК )
автор
Человек Знание языков
Anna French, German
Bill Chinese, Italian, Spanish
Ivan Chinese
Max English, French
Olga German, Japanese
Piter English, Russian
Sam Italian, Portuguese

Anna - "вдребезги" не понимает Bill-а. Связали
Bill - в туда же, не понимает Olga. Связали

получился связанный граф из 3-х вершин, который по твоей логике должен быть в решении.
Только вот Anna и Olga вполне могут, между собой, "шпрехать" по German
Соответственно решение - фуфло Картинка с другого сайта.
11 июн 21, 15:06    [22334459]     Ответить | Цитировать Сообщить модератору
 Re: Задание на собеседовании [Помогите]  [new]
Oleg_SQL
Member

Откуда: от туда
Сообщений: 96
какие графы... не использовать таблицы и тп

только СТЕ
11 июн 21, 16:12    [22334485]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить