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

Откуда:
Сообщений: 820
Всем привет! Есть таблица

ID Value Description
------------------------------------
1 Иванов Фамилия
2 11.11.2011 Дата рождения
3 РФ Гражданство
4 11111 Доп.инфо
5 test@test.ru Email
6 мужской Пол
7 111-11-11 Дом. телефон


кто-нибудь знает как развернуть таблицу по принципу PIVOT, так, чтобы значения Description были столбцами, а значениями соотв. ячеек были значения из Value


делаю нечто,

в @IN2 хранится перечень значений из Description ([Фамилия],[Дата рождения],[Гражданство]...)
set @q =
'
select ID,'+ @IN2 +'
from
( select ID,Value,Description from #T )AS T
PIVOT
( MAX(Value) FOR [Description] IN (' + @IN2 + ') ) as PivotTable'

SELECT @q

то есть, таблица разворачивается, но почему-то без значений Value....
EXEC(@q)


но увы, во всех ячейках вместо значений получаю Null
21 окт 11, 11:45    [11477385]     Ответить | Цитировать Сообщить модератору
 Re: PIVOT ( MAX(текстовое поле) FOR ...  [new]
iljy
Member

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

самый бросающийся в глаза косяк - у вас ID фигурирует в группировке, а они все разные.
21 окт 11, 12:15    [11477725]     Ответить | Цитировать Сообщить модератору
 Re: PIVOT ( MAX(текстовое поле) FOR ...  [new]
flashslash
Member [заблокирован]

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

переделал, добавил столбец группировки

IDGroup Value Description
------------------------------------
1 Иванов Фамилия
1 11.11.2011 Дата рождения
1 РФ Гражданство
1 11111 Доп.инфо
1 test@test.ru Email
1 мужской Пол
1 111-11-11 Дом. телефон
2 Иванов Фамилия
2 11.11.2010 Дата рождения
2 РФ Гражданство
2 22222 Доп.инфо
2 test2@test.ru Email
2 мужской Пол
2 222-11-11 Дом. телефон


запрос


set @q = 
			'
			select  '+ @IN2 +' 
			from
			( select IDCard,Value,Description from #T )AS T
			PIVOT
			( MAX(IDCard) FOR [Description] IN (' + @IN2 + ') ) as PivotTable'

			EXEC(@q)

также дает тот же результат... везде Null
21 окт 11, 12:26    [11477860]     Ответить | Цитировать Сообщить модератору
 Re: PIVOT ( MAX(текстовое поле) FOR ...  [new]
iljy
Member

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

скрипты выложите целиком. Заполнение таблицы и реальный сгенеренный скрипт, уже после сложения строк.
21 окт 11, 12:27    [11477876]     Ответить | Цитировать Сообщить модератору
 Re: PIVOT ( MAX(текстовое поле) FOR ...  [new]
flashslash
Member [заблокирован]

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

CREATE TABLE #T(
ID int IDENTITY(1,1) PRIMARY KEY,
IDCard int,
Value NVARCHAR(255),
[Description] NVARCHAR(255),
Name NVARCHAR(255),
IDFieldMetaInfo INT)
...

--Заполнение таблицы

INSERT INTO #T(Value,[Description],Name,IDFieldMetaInfo,IDCard)
SELECT Value, Description, Name, IDFieldMetaInfo,IDCard
FROM Table1


--выбор записей по PIVOT

select ['Фамилия'],['Имя'],['Отчество'],['Пол'],['Дата рождения']
from ( select IDCard,Value,Description from #T ) AS T
PIVOT ( MAX(IDCard) FOR [Description] IN (['Фамилия'],['Имя'],['Отчество'],['Пол'],['Дата рождения']) ) as PivotTable
21 окт 11, 16:41    [11480480]     Ответить | Цитировать Сообщить модератору
 Re: PIVOT ( MAX(текстовое поле) FOR ...  [new]
iljy
Member

Откуда:
Сообщений: 8711
flashslash
--Заполнение таблицы

INSERT INTO #T(Value,[Description],Name,IDFieldMetaInfo,IDCard)
SELECT Value, Description, Name, IDFieldMetaInfo,IDCard
FROM Table1

Круто!!

Вы понимаете, как работает PIVOT? Это группировка по всем полям, кроме двух, используемых собственно в выражении PIVOT. Вот и посмотрите, по чему у вас группируется.
21 окт 11, 16:44    [11480506]     Ответить | Цитировать Сообщить модератору
 Re: PIVOT ( MAX(текстовое поле) FOR ...  [new]
Glory
Member

Откуда:
Сообщений: 104751
flashslash
INSERT INTO #T(Value,[Description],Name,IDFieldMetaInfo,IDCard)
SELECT Value, Description, Name, IDFieldMetaInfo,IDCard
FROM Table1


Msg 208, Level 16, State 1, Line 1
Invalid object name 'Table1'.
21 окт 11, 16:46    [11480516]     Ответить | Цитировать Сообщить модератору
 Re: PIVOT ( MAX(текстовое поле) FOR ...  [new]
flashslash
Member [заблокирован]

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

это ведь не целый скрипт, а его часть...
а так процедура очень большая, я привел лишь то, что касается PIVOT
21 окт 11, 16:53    [11480559]     Ответить | Цитировать Сообщить модератору
 Re: PIVOT ( MAX(текстовое поле) FOR ...  [new]
Glory
Member

Откуда:
Сообщений: 104751
flashslash
это ведь не целый скрипт, а его часть...

И как теперь получить таблицу #T, заполненную хотя бы частью ваших данных ?
21 окт 11, 16:59    [11480621]     Ответить | Цитировать Сообщить модератору
 Re: PIVOT ( MAX(текстовое поле) FOR ...  [new]
flashslash
Member [заблокирован]

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

прошу прощения, скрипт ниже, это миниатюра моей задачи:

    drop table #tt
    
    create table #tt(value varchar(50), [description]  varchar(50))
    insert into #tt(value,[description]) values ('значение1','поле1')
    insert into #tt(value,[description]) values ('значение2','поле2')
    insert into #tt(value,[description]) values ('значение3','поле3')
    insert into #tt(value,[description]) values ('значение4','поле4')
     
     select ['поле1'],['поле2'],['поле3']
			from
			( select Value,[description] from #tt )AS T
			PIVOT
			( Max(Value) FOR [description] IN (['поле1'],['поле2'],['поле3']) ) as PivotTable
			
     
     

но этот скрипт вернет нулевую строку, а как сделать так, чтобы для полей ['поле1'],['поле2'],['поле3'] вернулись их значения...?


p.s. в таблице нет числовых полей, и поле value текстовое.
21 окт 11, 17:09    [11480701]     Ответить | Цитировать Сообщить модератору
 Re: PIVOT ( MAX(текстовое поле) FOR ...  [new]
iljy
Member

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

ясен пень NULL будут, у вас в содержимом полей апострофов нет, а в условия пивот вы их напихали.
21 окт 11, 17:15    [11480739]     Ответить | Цитировать Сообщить модератору
 Re: PIVOT ( MAX(текстовое поле) FOR ...  [new]
flashslash
Member [заблокирован]

Откуда:
Сообщений: 820
возможно вопрос глупый, потому что группировка подразумевает числовое поле,
но ведь не все значения числовые, в моем случае только текст
21 окт 11, 17:18    [11480763]     Ответить | Цитировать Сообщить модератору
 Re: PIVOT ( MAX(текстовое поле) FOR ...  [new]
flashslash
Member [заблокирован]

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

спасибо! исправил, получил 1 строку.... если писать

PIVOT
( Max(value) FOR ...
то получаю 1 строку, но мне нужно получить все значения Value для всех полей, по сути агрегация мне не нужна...
21 окт 11, 17:22    [11480787]     Ответить | Цитировать Сообщить модератору
 Re: PIVOT ( MAX(текстовое поле) FOR ...  [new]
Glory
Member

Откуда:
Сообщений: 104751
flashslash
то получаю 1 строку, но мне нужно получить все значения Value для всех полей, по сути агрегация мне не нужна...

Для того, чтобы было больше одной строчки, нужно больше двух полей
21 окт 11, 17:23    [11480795]     Ответить | Цитировать Сообщить модератору
 Re: PIVOT ( MAX(текстовое поле) FOR ...  [new]
flashslash
Member [заблокирован]

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

Сделал вот так:


    drop table #tt
    
    create table #tt(id int primary key identity,
					 value varchar(50), 
					 [description]  varchar(50))
					 
    insert into #tt(value,[description]) values ('значение1','поле1')
    insert into #tt(value,[description]) values ('значение2','поле2')
    insert into #tt(value,[description]) values ('значение3','поле3')
    insert into #tt( value,[description]) values ('значение4','поле4')

    insert into #tt(value,[description]) values ('значение11','поле1')
    insert into #tt(value,[description]) values ('значение22','поле2')
    insert into #tt(value,[description]) values ('значение33','поле3')
    insert into #tt( value,[description]) values ('значение44','поле4')
     
     select * from #tt
     
     select [id],[поле1],[поле2],[поле3]
			from
			( select id,value,[description] from #tt )AS T
			PIVOT
			( Min(value) FOR [description] IN ([поле1],[поле2],[поле3]) ) as PivotTable
			
	



Получил таблицу, где значения полей идут по диагонали через строку, т.е. так:

id Поле1 Поле2 Поле3
---------------------------------------------
1 значение1 NULL NULL
2 NULL значение2 NULL
3 NULL NULL значение3
4 NULL NULL NULL
5 значение11 NULL NULL
6 NULL значение22 NULL
7 NULL NULL значение33
8 NULL NULL NULL


почему не получилось нормального распределения значения по столбцам?
21 окт 11, 17:35    [11480875]     Ответить | Цитировать Сообщить модератору
 Re: PIVOT ( MAX(текстовое поле) FOR ...  [new]
iljy
Member

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

11255055
21 окт 11, 17:40    [11480907]     Ответить | Цитировать Сообщить модератору
 Re: PIVOT ( MAX(текстовое поле) FOR ...  [new]
Glory
Member

Откуда:
Сообщений: 104751
flashslash
почему не получилось нормального распределения значения по столбцам?

Потому что id уникальные надо полагать
21 окт 11, 17:44    [11480937]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить