Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Перевернуть таблицу, pivot unpivot  [new]
интересный запрос
Guest
Есть таблица
coldata1data2
10ШК11111111
10ШК22222222
10ШК33333333
20ШК44444444
20ШК55555555
20ШК66666666
30ШК77777777
30ШК88888888

Надо получить такой результат
102030
ШК1ШК4ШК7
11111444444777777
ШК2ШК5ШК8
22222555555888888
ШК3ШК6NULL
33333666666NULL

Получилось сделать только наполовину
declare @t table (col int, data1 varchar(max), data2 varchar(max))
insert @t values (10, 'ШК1', '1111111'), (10, 'ШК2', '2222222'), (10, 'ШК3', '3333333'), (20, 'ШК4', '4444444'), (20, 'ШК5', '5555555'), (20, 'ШК6', '6666666'),
(30, 'ШК7', '7777777'), (30, 'ШК8', '8888888')

select * from @t

;with unpvt as (
  select t.col, i.a
  from @t t
  cross apply (select data1 union all select data2) i([a])
)
select *
from unpvt t1
9 июн 15, 09:46    [17747892]     Ответить | Цитировать Сообщить модератору
 Re: Перевернуть таблицу, pivot unpivot  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
интересный запрос, я не очень понимаю задачу, потому что дан только пример - неясно, для чего нужно именно такое представление, но получается что-то вроде такого:

with ordered_t as
(
	select	col, data1, data2
		,	row_number() over (partition by col order by data1, data2) as rn 
	from	@t
),
pivoted_t as
(
	select	rn, 1 as ord, max([10]) as [10], max([20]) as [20], max([30]) as [30]
	from	ordered_t
	pivot	(max(data1) for col in ([10], [20], [30])) as pvt_data1
	group by rn
	union all
	select	rn, 2 as ord, max([10]), max([20]), max([30])
	from	ordered_t
	pivot	(max(data2) for col in ([10], [20], [30])) as pvt_data2
	group by rn
)
select	[10], [20], [30]
from	pivoted_t
order	by rn, ord
9 июн 15, 10:20    [17748031]     Ответить | Цитировать Сообщить модератору
 Re: Перевернуть таблицу, pivot unpivot  [new]
интересный запрос
Guest
Minamoto,

тут есть вопрос про отчет 17743380, MS Reporting действительно не умеет так переворачивать. Я подумал, вдруг на T-SQL есть способ.
За решение спасибо, возьму в копилку знаний!
9 июн 15, 10:26    [17748073]     Ответить | Цитировать Сообщить модератору
 Re: Перевернуть таблицу, pivot unpivot  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
интересный запрос, MS Reporting наверняка умеет, им просто нужно уметь пользоваться :)

Не хочется сейчас делать репро, но я уверен, что можно чисто средствами Reporting'а такое сделать.

Другой вопрос - кому какой вариант удобнее.
9 июн 15, 10:34    [17748156]     Ответить | Цитировать Сообщить модератору
 Re: Перевернуть таблицу, pivot unpivot  [new]
Кролик-зануда
Guest
Minamoto,
можно и одним пивотом обойтись
declare @t table (col int, data1 varchar(max), data2 varchar(max))
insert @t values (10, 'ШК1', '1111111'), (10, 'ШК2', '2222222'), (10, 'ШК3', '3333333'), (20, 'ШК4', '4444444'), (20, 'ШК5', '5555555'), (20, 'ШК6', '6666666'),
(30, 'ШК7', '7777777'), (30, 'ШК8', '8888888');

with a as
(select *,row_number()over(partition by col order by data1, data2)r
  from @t)
select * from   
(select col,case x when 1 then data1 else data2 end d,row_number()over(partition by col order by r,x)r
  from a,(values(1),(2))x(x))u
pivot(max(d) for col in([10],[20],[30]))p
9 июн 15, 10:46    [17748249]     Ответить | Цитировать Сообщить модератору
 Re: Перевернуть таблицу, pivot unpivot  [new]
o-o
Guest
про то, как в репортинге это делается, с картинками в той другой теме
9 июн 15, 11:32    [17748571]     Ответить | Цитировать Сообщить модератору
 Re: Перевернуть таблицу, pivot unpivot  [new]
интересный запрос
Guest
o-o,

про догадался про row_number()... А за решение с картинками отдельное спасибо!
9 июн 15, 11:40    [17748628]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить