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

Откуда: Москва
Сообщений: 52
Господа, добрый день!
Столкнулся с нетривиальной для себя проблемой.
Имеется табличка с 4 полями, например:
ID1 ID2 Val Stat
1 A1 10 1
1 A2 11 2
2 A1 10 1
2 A2 11 1
Можно ли получить ее в виде:
ID1 A1 (Val) A1 (Stat) A2 (Val) A2 (Stat)
1 10 1 11 2
2 10 1 11 1

То есть требуется получить перекрестную табличку с несколькими значащими полями для одной группировки. С одним значением проблем нет, PIVOT SUM(Val) ... и вперед. А вот с двумя??? Может был у кого подобный опыт?
11 мар 12, 12:37    [12224727]     Ответить | Цитировать Сообщить модератору
 Re: Перекрестная таблица с несколькими результирующими полями  [new]
iljy
Member

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

group by + SUM(case ID2 when 'A1' then Val end), SUM(case ID2 when 'A1' then Stat end), ...
11 мар 12, 12:45    [12224792]     Ответить | Цитировать Сообщить модератору
 Re: Перекрестная таблица с несколькими результирующими полями  [new]
Asid_new
Member

Откуда: Москва
Сообщений: 52
К сожалению, количество А1, А2 и т.д. может меняться... Со всеми вытекающими
11 мар 12, 12:51    [12224823]     Ответить | Цитировать Сообщить модератору
 Re: Перекрестная таблица с несколькими результирующими полями  [new]
user89
Member

Откуда:
Сообщений: 2083
Asid_new,
Когда-то находил про динамический case
https://www.sql.ru/forum/actualthread.aspx?tid=835796&pg=1&mid=10377620#10377620
11 мар 12, 12:56    [12224845]     Ответить | Цитировать Сообщить модератору
 Re: Перекрестная таблица с несколькими результирующими полями  [new]
qwerty112
Guest
    set @SQL1 = 
	(select distinct 
		'['+ID2+'-Val],['+ID2+'-Stat],' as 'data()' 
	from t 
	order by '['+ID2+'-Val],['+ID2+'-Stat],'
	for xml path(''))
	
	set @SQL1 = left(@SQL1, len(@SQL1)-1)

	----
    set @SQL = 
	'select ID1, '+@SQL1+'
	from

	(select ID1, ID2+''-Val'' as xz, Val as xz1 from t
	union all
	select ID1, ID2+''-Stat'', Stat from t) a

	pivot (sum([xz1]) for xz in ('+@SQL1+')) pvt'


exec(@SQL)

ID1         A1-Val      A1-Stat     A2-Val      A2-Stat
----------- ----------- ----------- ----------- -----------
1           10          1           11          2
2           10          1           11          1

(2 row(s) affected)
11 мар 12, 13:10    [12224937]     Ответить | Цитировать Сообщить модератору
 Re: Перекрестная таблица с несколькими результирующими полями  [new]
Asid_new
Member

Откуда: Москва
Сообщений: 52
qwerty112,
очень круто, спасибо! Попробую сейчас применить к реальной таблице...
11 мар 12, 13:16    [12224983]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить