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

Откуда: дровишки?
Сообщений: 6067
Всем привет.

Делаю отчёт в MS SQL.
Свёл данные к следующему виду:
Сотрудник Компетенция Оценка1 Оценка2
Иванов Смелость 56 78
Иванов Решительность 89 45
Иванов Амбициозность 50 51
Петров Смелость 23 45
Петров Решительность 45 71
Петров Амбициозность 67 70


На выходе же мне надо получить таблицу вида:
Сотрудник Компетенция1 Оценка11 Оценка21 Компетенция2 Оценка21 Оценка22 Компетенция3 Оценка31 Оценка32
Иванов Смелость 56 78 Решительность 89 45 Амбициозность 50 51
Петров Смелость 23 45 Решительность 45 71 Амбициозность 67 70


Думал, что можно сделать это pivot-ом, но т.к. никогда им не пользовался, то безуспешно проковырялся до 5 утра. Получалось что-то похожее только для одной оценки.

Подскажите, пожалуйста, как можно это сделать?
25 июл 15, 11:23    [17933502]     Ответить | Цитировать Сообщить модератору
 Re: [Помогите с запросом] Транспонировать один столбец, размножив 2 других  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
brbrbr
Подскажите, пожалуйста, как можно это сделать?
group by + case
25 июл 15, 11:58    [17933566]     Ответить | Цитировать Сообщить модератору
 Re: [Помогите с запросом] Транспонировать один столбец, размножив 2 других  [new]
brbrbr
Member

Откуда: дровишки?
Сообщений: 6067
invm
brbrbr
Подскажите, пожалуйста, как можно это сделать?
group by + case

Что-то в таком духе?
with t (fullname, competence, mark1, mark2) as (
	select 'Иванов', 'Смелость', 41, 56
	union select 'Иванов', 'Решительность', 22, 88
	union select 'Иванов', 'Амбициозность', 13, 77
	union select 'Петров', 'Смелость', 44, 32
	union select 'Петров', 'Решительность', 56, 89
	union select 'Петров', 'Амбициозность', 90, 20
)
select
	t.fullname,
	'Смелость' as 'competence1',
	max(case when t.competence = 'Смелость' then t.mark1 else null end) as 'mark11',
	max(case when t.competence = 'Смелость' then t.mark2 else null end) as 'mark12',
	'Решительность' as 'competence1',
	max(case when t.competence = 'Решительность' then t.mark1 else null end) as 'mark21',
	max(case when t.competence = 'Решительность' then t.mark2 else null end) as 'mark22',
	'Амбициозность' as 'competence1',
	max(case when t.competence = 'Амбициозность' then t.mark1 else null end) as 'mark31',
	max(case when t.competence = 'Амбициозность' then t.mark2 else null end) as 'mark32'
from
	t
group by
	t.fullname


А если количество компетенций изменится?
25 июл 15, 12:48    [17933639]     Ответить | Цитировать Сообщить модератору
 Re: [Помогите с запросом] Транспонировать один столбец, размножив 2 других  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
brbrbr
Что-то в таком духе?
Да.
brbrbr
А если количество компетенций изменится?
Придется переписать запрос, либо формировать его динамически.
Или транспонировать на клиенте.
Или воспользоваться возможностями OLAP.
25 июл 15, 13:15    [17933677]     Ответить | Цитировать Сообщить модератору
 Re: [Помогите с запросом] Транспонировать один столбец, размножив 2 других  [new]
brbrbr
Member

Откуда: дровишки?
Сообщений: 6067
Понял, спасибо.
25 июл 15, 13:21    [17933692]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить