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

Откуда: Санкт-Петербург
Сообщений: 1078
Есть таблица:

select FIO, GOD, SUMMA
from tb1


FIO        GOD   SUMMA
Иванов   2011  11
Петров   2011  21
Сидоров  2011  31
Иванов   2011  12
Петров   2011  22
Сидоров  2011  32


Транспонируем по году:

select fio, [2011], [2012]
from tb1
PIVOT (sum(SUMMA) for GOD in ([2011],[2012])) 


FIO        2011  2012
Иванов   11     12
Петров   21     22
Сидоров  31     32


Всё понятно, но как сделать так же красиво если имеется две колонки с суммами и нужно их всех вытянуть в строчку?

Имеется:

select FIO, GOD, SUMMA, SUMMA2
from tb1


FIO        GOD   SUMMA  SUMMA2
Иванов   2011  11         111 
Петров   2011  21          211
Сидоров  2011  31          311
Иванов   2011  12         121
Петров   2011  22         221 
Сидоров  2011  32         321


Нужно получить следующее:

FIO        2011  2012 2011-2  2012-2
Иванов   11     12    111       121
Петров   21     22    211       221
Сидоров  31     32    311       321
1 июл 16, 01:17    [19357644]     Ответить | Цитировать Сообщить модератору
 Re: PIVOT для нескольких колонок  [new]
verter
Member

Откуда: Санкт-Петербург
Сообщений: 1078
немного поспешил - вот правильно:

Есть таблица:

select FIO, GOD, SUMMA
from tb1


FIO        GOD   SUMMA
Иванов   2011  11
Петров   2011  21
Сидоров  2011  31
Иванов   2012  12
Петров   2012  22
Сидоров  2012  32


Транспонируем по году:

select fio, [2011], [2012]
from tb1
PIVOT (sum(SUMMA) for GOD in ([2011],[2012])) 


FIO        2011  2012
Иванов   11     12
Петров   21     22
Сидоров  31     32


Всё понятно, но как сделать так же красиво если имеется две колонки с суммами и нужно их всех вытянуть в строчку?

Имеется:

select FIO, GOD, SUMMA, SUMMA2
from tb1


FIO        GOD   SUMMA  SUMMA2
Иванов   2011  11         111 
Петров   2011  21          211
Сидоров  2011  31          311
Иванов   2012  12         121
Петров   2012  22         221 
Сидоров  2012  32         321


Нужно получить следующее:

FIO        2011  2012 2011-2  2012-2
Иванов   11     12    111       121
Петров   21     22    211       221
Сидоров  31     32    311       321
[/quot]
1 июл 16, 01:19    [19357647]     Ответить | Цитировать Сообщить модератору
 Re: PIVOT для нескольких колонок  [new]
3unknown
Member

Откуда: New York
Сообщений: 140
declare @values table(FIO varchar(15), GOD char(4), SUMMA int, SUMMA2 int)

insert @values
select 'Ivanov','2011', 11,111 
union
select 'Petrov','2011',21, 211
Union
select 'Sidorov','2011',31,311
union
select 'Ivanov','2012', 12,121 
union
select 'Petrov','2012' ,22 ,221 
Union
select 'Sidorov','2012',32,321



select FIO
,sum(case when god = '2011' then summa end) as '2011'
,sum(case when god = '2012' then summa end) as '2012'
,sum(case when god = '2011' then SUMMA2 end) as '2011-2'
,sum(case when god = '2012' then SUMMA2 end) as '2012-2'
from @values
group by FIO
1 июл 16, 01:37    [19357661]     Ответить | Цитировать Сообщить модератору
 Re: PIVOT для нескольких колонок  [new]
iljy
Member

Откуда:
Сообщений: 8711
verter,

PIVOT - это просто синтаксический сахар для частного случая. Используйте полную форму

select FIO, SUM(case GOD when 2011 then SUMMA else 0 end) [2011]
		  , SUM(case GOD when 2012 then SUMMA else 0 end) [2012]
from tb1
group by FIO


и можете добавлять любые колонки по тому же принципу.
1 июл 16, 01:43    [19357664]     Ответить | Цитировать Сообщить модератору
 Re: PIVOT для нескольких колонок  [new]
_human
Member

Откуда:
Сообщений: 569
verter,

Для фанатов послаще
declare @values table(FIO varchar(15), GOD char(4), SUMMA int, SUMMA2 int)

insert @values

select 'Ivanov','2011', 11,111 
union
select 'Petrov','2011', 21, 211
Union
select 'Sidorov','2011',31,311
union
select 'Ivanov','2012', 12,121 
union
select 'Petrov','2012' ,22 ,221 
Union
select 'Sidorov','2012',32,321

;with unpvt as (
	select up.*, concat(god, '-', cols) as BDSM
	from
	(	select *
		from @values 
	) s 
	unpivot (Val for cols in ([SUMMA], [SUMMA2])) as up )

select p.*
from
(	select FIO, val, BDSM
	from unpvt ) as s
pivot(sum(val) for BDSM in ([2011-SUMMA],[2011-SUMMA2],[2012-SUMMA],[2012-SUMMA2])) as p
1 июл 16, 17:50    [19360898]     Ответить | Цитировать Сообщить модератору
 Re: PIVOT для нескольких колонок  [new]
verter
Member

Откуда: Санкт-Петербург
Сообщений: 1078
спасибо!
2 июл 16, 16:09    [19362871]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить