Pivot. Как реализовать переворот нескольких строк в таблице?

Доброго времени, Господа.
Существует таблица, вида
84f706e223b859ac9b07726a517710a74accc36e

Ее необходимо перевернуть, так, чтобы значения sync_table стали заголовками строк, при том не повторясь, а date_max - стали столбцами.
Примерно так:
b8ea9fe0aa49f3667495931d19e1a3ab3333d5ec
Вот код, как получилось:
select sync_table, 
	[2014-02-14],[2014-02-15],[2014-02-16],[2014-02-17],[2014-02-18] 
	from
	(
		select 
		CAST([date] AS VARCHAR(24))+'' as [date_max]
		, sync_table
		, max(ms_duration) as max_time
		from #t 
		group by [date], sync_table
		having sync_table is not null
	)x
	PIVOT
	(
		MAX([max_time]) FOR [date_max] IN ([2014-02-14],[2014-02-15],[2014-02-16],[2014-02-17],[2014-02-18])
	)xx

Но в этом примере перевернута только одна строка(max_time), а надо, чтобы перевернулись и max_time и min_time, но если я делаю еще один pivot, то получается вот так:
a573f50bf4b778320a07faa5fe48ca80ab194f5e
То есть вроде бы правильно, но, например на этом примере, строка Cars должна быть одна, и NULL повторяться непонятное количество раз не должно.
Вот код, как получилась последняя картинка
select sync_table, 
	[2014-02-14-MAX],[2014-02-15-MAX],[2014-02-16-MAX],[2014-02-17-MAX],[2014-02-18-MAX] 
	,[2014-02-14-MIN],[2014-02-15-MIN],[2014-02-16-MIN],[2014-02-17-MIN],[2014-02-18-MIN]
	from
	(
		select 
		  CAST([date] AS VARCHAR(24))+'-MAX' as [date_max]
		, CAST([date] AS VARCHAR(24))+'-MIN' as [date_min]
		, sync_table
		, max(ms_duration) as max_time
		, AVG(ms_duration) as avg_time 
		--, MIN(ms_duration) as min_time 
		from #t 
		group by [date], sync_table
		having sync_table is not null
	)x
	PIVOT
	(
		MAX([max_time]) FOR [date_max] IN ([2014-02-14-MAX],[2014-02-15-MAX],[2014-02-16-MAX],[2014-02-17-MAX],[2014-02-18-MAX])
	)xx
	PIVOT
	(
		MAX([avg_time]) FOR [date_min] IN ([2014-02-14-MIN],[2014-02-15-MIN],[2014-02-16-MIN],[2014-02-17-MIN],[2014-02-18-MIN])
	)xxx


Подскажите пожалуйста, в чем ошибка?
  • Вопрос задан
  • 2898 просмотров
Решения вопроса 1
xvladimirov
@xvladimirov Автор вопроса
Нашел решение, если кому понадобится.
select sync_table,[2014-02-14-MAX],[2014-02-15-MAX],[2014-02-16-MAX],[2014-02-17-MAX],[2014-02-18-MAX],[2014-02-14-MIN],[2014-02-15-MIN],[2014-02-16-MIN],[2014-02-17-MIN],[2014-02-18-MIN],[2014-02-14-AVG],[2014-02-15-AVG],[2014-02-16-AVG],[2014-02-17-AVG],[2014-02-18-AVG]
	from
	(
		select * from(
		
			select 
			cast([date] as varchar(12))+'-MAX' as date_
			, sync_table
			, MAX(ms_duration) as _time 
			from #t 
			group by [date], sync_table
			having sync_table is not null
			UNION ALL(
				select 
				cast([date] as varchar(12))+'-AVG' as date_
				, sync_table
				, AVG(ms_duration) as _time 
				from #t 
				group by [date], sync_table
				having sync_table is not null
			)
			UNION ALL(
				select 
				cast([date] as varchar(12))+'-MIN' as date_
				, sync_table
				, MIN(ms_duration) as _time 
				from #t 
				group by [date], sync_table
				having sync_table is not null
			)
			
		)united --order by sync_table, date_, _time
	)x
	PIVOT
	(
		MAX(_time) FOR date_ IN ([2014-02-14-MAX],[2014-02-15-MAX],[2014-02-16-MAX],[2014-02-17-MAX],[2014-02-18-MAX],[2014-02-14-MIN],[2014-02-15-MIN],[2014-02-16-MIN],[2014-02-17-MIN],[2014-02-18-MIN],[2014-02-14-AVG],[2014-02-15-AVG],[2014-02-16-AVG],[2014-02-17-AVG],[2014-02-18-AVG])
	)xx
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы