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

Откуда: Белгород
Сообщений: 458
Стандартным запросом:
select name, value, date from table получаем набор данных:
name1 | value11 | date1
name1 | value12 | date2
name2 | value21 | date1
name3 | value31 | date1
name3 | value32 | date2
Подскажите пожалуйста как в запросе развернуть результат выборки, к виду:
name1 | value11 | value12
name2 | value21 | ''
name3 | value31 | value32

Может неточно описал, но как-то так... мне бы хотя бы понять как разворачивать результат выборки к произвольному виду ?
8 окт 12, 12:00    [13283312]     Ответить | Цитировать Сообщить модератору
 Re: Как развернуть результат выборки данных?  [new]
Добрый Э - Эх
Guest
смотреть в сторону PIVOT-а
8 окт 12, 12:04    [13283357]     Ответить | Цитировать Сообщить модератору
 Re: Как развернуть результат выборки данных?  [new]
Добрый Э - Эх
Guest
Если версия сервера не понимает PIVOT, то банальным CASE + GROUP BY
8 окт 12, 12:05    [13283363]     Ответить | Цитировать Сообщить модератору
 Re: Как развернуть результат выборки данных?  [new]
Добрый Э - Эх
Guest
Как вариант, для затравки: тынц
8 окт 12, 12:07    [13283370]     Ответить | Цитировать Сообщить модератору
 Re: Как развернуть результат выборки данных?  [new]
Алексей Кр
Member

Откуда: Белгород
Сообщений: 458
Спасибо огромное!
Подскажите пожалуйста PIVOT/UNPIVOT с какой версии T-SQL начали действовать?
8 окт 12, 12:13    [13283415]     Ответить | Цитировать Сообщить модератору
 Re: Как развернуть результат выборки данных?  [new]
Добрый Э - Эх
Guest
Алексей Кр,

2005
8 окт 12, 12:16    [13283433]     Ответить | Цитировать Сообщить модератору
 Re: Как развернуть результат выборки данных?  [new]
nezhadnye_my
Guest
2005
8 окт 12, 12:16    [13283435]     Ответить | Цитировать Сообщить модератору
 Re: Как развернуть результат выборки данных?  [new]
Алексей Кр
Member

Откуда: Белгород
Сообщений: 458
Спасибо большое!
Попробую поэксперементировать :)
8 окт 12, 12:17    [13283437]     Ответить | Цитировать Сообщить модератору
 Re: Как развернуть результат выборки данных?  [new]
Алексей Кр
Member

Откуда: Белгород
Сообщений: 458
Не могу понять, что делаю не так?

после этого:
SELECT ttt2, fields, aData 
	FROM (
		select 			
			cast(Value as varchar(100)) as ttt, 
			cast(Name as varchar(100)) as ttt1,
			cast(YEAR([DATE]) as varchar(100)) as ttt2 
			from TableValues as a
		where TableValues.KetGuid in ('12345678')
	) AS t
	UNPIVOT (
	  aData FOR fields in (ttt, ttt1)
	) AS unpvt


получаем следующее:
"ttt2" |fields | aData
---------------------
2010 ttt Значение1
2010 ttt1 Наименование
2011 ttt Значение2
2011 ttt1 Наименование

после этого:

select ttt, ttt1, ttt2
from (
	SELECT ttt2, fields, aData 
	FROM (
		select 			
			cast(Value as varchar(100)) as ttt, 
			cast(Name as varchar(100)) as ttt1,
			cast(YEAR([DATE]) as varchar(100)) as ttt2 
			from TableValues as a
		where TableValues.KetGuid in ('12345678')
	) AS t
	UNPIVOT (
	  aData FOR fields in (ttt, ttt1)
	) AS unpvt
)tt
pivot (max(aData) for fields in (ttt, ttt1)
)pvt


получаем следующее:
"ttt" | "ttt1" | "ttt2"
-----------------------------------
Значение1 Наименование 2010
Значение2 Наименование 2011


Как получить:
"ttt1" | 2010 | 2011
-------------------------------------
Наименование Значение1 Значение2

Надеюсь смысл, структура запросов понятна.
8 окт 12, 14:41    [13284765]     Ответить | Цитировать Сообщить модератору
 Re: Как развернуть результат выборки данных?  [new]
nezhadnye_my
Guest
declare @t table (c1 varchar(10), c2 varchar(10), c3 varchar(10))
insert into @t values 
('name1' , 'value11' , 'date1'),
('name1' , 'value12' , 'date2'),
('name2' , 'value21' , 'date1'),
('name3' , 'value31' , 'date1'),
('name3' , 'value32' , 'date2')

select *
from @t pivot (max(c2) for c3 in ([date1], [date2]))p


c1	date1	date2
name1	value11	value12
name2	value21	NULL
name3	value31	value32
8 окт 12, 14:59    [13284927]     Ответить | Цитировать Сообщить модератору
 Re: Как развернуть результат выборки данных?  [new]
Алексей Кр
Member

Откуда: Белгород
Сообщений: 458
Спасибо большое.
Но видимо тоже никак... тут нужно указывать в списке перечислении : ([date1], [date2]), а если количество дат неизвестно, то есть количество динамично...
8 окт 12, 15:03    [13284963]     Ответить | Цитировать Сообщить модератору
 Re: Как развернуть результат выборки данных?  [new]
Алексей Кр
Member

Откуда: Белгород
Сообщений: 458
В принципе разобрался...
Единственный досадный момент следующий:
если не знаем какие могут быть даты, а даты могут быть произвольные и неизвестное количество штук, как тогда прописать
в данном случае, вместо:
pivot (max(aData) for ttt2 in ([2010], [2011])
то есть тут явно указываются определенные годы, а если хотелось бы построить динамический отчет, что нужно в in(...) прописать?
можно ли там добавить вложенные какие либо подзапросы?
8 окт 12, 16:21    [13285680]     Ответить | Цитировать Сообщить модератору
 Re: Как развернуть результат выборки данных?  [new]
Алексей Кр
Member

Откуда: Белгород
Сообщений: 458
эх... разочаровался в pivot (((
8 окт 12, 16:50    [13285906]     Ответить | Цитировать Сообщить модератору
 Re: Как развернуть результат выборки данных?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Алексей Кр
эх... разочаровался в pivot (((
Добро пожаловать в клуб.
8 окт 12, 16:55    [13285945]     Ответить | Цитировать Сообщить модератору
 Re: Как развернуть результат выборки данных?  [new]
Алексей Кр
Member

Откуда: Белгород
Сообщений: 458
Недоделанный pivot (((
А результат такой красивый получается , но увы... должно быть всё известно... а в реальности такого быть не может (((
автор
Наименование | 2010 | 2011
---------------------------------------------
Показатель1 | знач11 | знач12
Показатель2 | NULL | знач22
Показатель3 | знач31 | знач32

и т.п.

а если даты неизвестны, или выборка по другим связывающим полям идет, эх....

недоделанная функция (((((
8 окт 12, 17:01    [13285983]     Ответить | Цитировать Сообщить модератору
 Re: Как развернуть результат выборки данных?  [new]
Алексей Кр
Member

Откуда: Белгород
Сообщений: 458
Кажется перехитрил T-SQL
Сформировав строку с запросом и вызвав
exec sp_executesql @sql

Теперь количество столбцов может быть неизвестным и динамичным :)
8 окт 12, 17:29    [13286188]     Ответить | Цитировать Сообщить модератору
 Re: Как развернуть результат выборки данных?  [new]
igorigorm
Member

Откуда:
Сообщений: 1
Алексей Кр, поделитесь полученным запросом?
9 ноя 12, 13:05    [13445614]     Ответить | Цитировать Сообщить модератору
 Re: Как развернуть результат выборки данных?  [new]
pegoopik
Member

Откуда: Новосибирск
Сообщений: 54
igorigorm,

Например так:

CREATE TABLE T (name VARCHAR(10),value INT, date DATETIME)
INSERT INTO T SELECT '1',11,'1900-01-01'
INSERT INTO T SELECT '1',12,'1900-01-02'
INSERT INTO T SELECT '1',13,'1900-01-03'
INSERT INTO T SELECT '2',21,'1900-01-01'
INSERT INTO T SELECT '2',22,'1900-01-02'
INSERT INTO T SELECT '2',23,'1900-01-03'
INSERT INTO T SELECT '2',24,'1900-01-04'

declare
  @SQL NVARCHAR(4000),
  @CntVals INT,
  @I INT

SET @CntVals=(SELECT MAX(X)FROM(SELECT COUNT(*)X FROM T GROUP BY name)T)
SET @SQL = 'SELECT name'
SET @I=1

WHILE @I<=@CntVals
BEGIN
  SET @SQL = @SQL + ',MAX(CASE WHEN N='+CAST(@I AS VARCHAR(10))+' THEN Value END)V'+CAST(@I AS VARCHAR(10))
  SET @I = @I + 1
END

SET @SQL = @SQL + ' FROM(SELECT ROW_NUMBER()OVER(PARTITION BY name ORDER BY date)N,*FROM T)T GROUP BY name'

exec sp_executesql @sql

DROP TABLE T
nameV1V2V3V4
1111213NULL
221222324
9 ноя 12, 13:24    [13445860]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить