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

Откуда:
Сообщений: 79
Не получается перевернуть таблу. Нормально использовать PIVOT не выходит, функцию агрегирования применить не к чему.
Есть вот такие данные, немного упростил, сути это не менят
select 1 as [Код_территории]
     , N'ОТС' as [Специализация]
	 , N'535' as [Код зоны ответственности]
union all
select 1 
     , N'RX/OTX КН' 
	 , N'A245'
union all
select 1 
     , N'VC' 
	 , N'BCB9'
union all
select 2 
     , N'PH' 
	 , N'E411' as [Код_зоны_ответственности]
union all
select 2 
     , N'RX/OTX ГУД' as Spec
	 , N'81D7'
union all
select 2 
     , N'VC' 
	 , N'F679'


На выходе хочу получить вот это

select 1 as [Код_территории]
      ,N'535' as [OTC]
	  ,N'A245' as [RX/OTX КН]
	  ,N'BCB9' as [VC]
	  ,NULL AS [PH]
	  ,NULL as [RX/OTX ГУД]
union all
select 2 as [Код_территории]
      ,NULL as [OTC]
	  ,NULL as [RX/OTX КН]
	  ,N'F679' as [VC]
	  , N'E411' AS [PH]
	  , N'81D7' as [RX/OTX ГУД]


К сообщению приложен файл. Размер - 35Kb
11 авг 15, 15:54    [18004018]     Ответить | Цитировать Сообщить модератору
 Re: PIVOT или как перевернуть таблу  [new]
virtuOS
Member

Откуда: большая деревня
Сообщений: 266
-- Тестовые данные
;with cte as (
select 1 as [Код_территории]
     , N'ОТС' as [Специализация]
	 , N'535' as [Код зоны ответственности]
union all
select 1 
     , N'RX/OTX КН' 
	 , N'A245'
union all
select 1 
     , N'VC' 
	 , N'BCB9'
union all
select 2 
     , N'PH' 
	 , N'E411' as [Код_зоны_ответственности]
union all
select 2 
     , N'RX/OTX ГУД' as Spec
	 , N'81D7'
union all
select 2 
     , N'VC' 
	 , N'F679'

)

select [Код_территории],
		[ОТС], [RX/OTX КН], [VC], [PH], [RX/OTX ГУД]
from cte T
PIVOT (
	max([Код зоны ответственности])
	for [Специализация] in ([ОТС], [RX/OTX КН], [VC], [PH], [RX/OTX ГУД])

) as pvt
11 авг 15, 16:17    [18004110]     Ответить | Цитировать Сообщить модератору
 Re: PIVOT или как перевернуть таблу  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
IF OBJECT_ID('tempdb.dbo.#temp') IS NOT NULL
	DROP TABLE #temp

CREATE TABLE #temp
(
	region_code INT,
	spec NVARCHAR(50),
	code NVARCHAR(50),
	PRIMARY KEY (region_code, spec)
)

INSERT INTO #temp (region_code, spec, code)
VALUES
	(1, N'ОТС', N'535'),
	(1, N'RX/OTX КН', N'A245'),
	(1, N'VC', N'BCB9'),
	(2, N'PH', N'E411'),
	(2, N'RX/OTX ГУД', N'81D7'),
	(2, N'VC', N'F679')

DECLARE @SQL NVARCHAR(MAX)
SET @SQL = N'
SELECT *
FROM #temp t
PIVOT (
	MAX(code)
	FOR spec IN (' + STUFF((
	SELECT DISTINCT ', [' + spec + ']'
	FROM #temp
	FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, '') + ')
) p'

EXEC sys.sp_executesql @SQL
11 авг 15, 16:21    [18004130]     Ответить | Цитировать Сообщить модератору
 Re: PIVOT или как перевернуть таблу  [new]
Durex_
Member

Откуда:
Сообщений: 79
AlanDenton,virtuOS,
Премного благодарен!! Ура! Не совсем понял причем тут MAX() в запросе, но работает... похоже, что затык был именно в этом месте.
Еще раз спасибо за варианты.
11 авг 15, 16:49    [18004301]     Ответить | Цитировать Сообщить модератору
 Re: PIVOT или как перевернуть таблу  [new]
Durex_
Member

Откуда:
Сообщений: 79
AlanDenton,
Вообще крутотень, динамическое появление новых столбцов - оч. полезный пример.
12 авг 15, 08:54    [18006433]     Ответить | Цитировать Сообщить модератору
 Re: PIVOT или как перевернуть таблу  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
Рад что смог помочь... будет желание вот еще пост по поводу PIVOT - http://habrahabr.ru/post/206630/
12 авг 15, 10:01    [18006611]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить