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

Откуда:
Сообщений: 19
помогите с UNPIVOT'ом

есть таблица

create table t_Table
(
Field_1 varchar(100),
Field_2 varchar(100),
Field_3 varchar(100)
)

значения в таблице
insert into t_Table
select 'один', 'два', 'три'

нужно получить UNPIVOT который бы вернул

Field_Name | Value
-------------------
Field_1 | один
Field_2 | два
Field_3 | три

что то, никак не соображу, подскажите
8 авг 14, 12:59    [16416802]     Ответить | Цитировать Сообщить модератору
 Re: помогите с UNPIVOT'ом  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8316
А где сам запрос и сообщение об ошибке?
8 авг 14, 13:02    [16416821]     Ответить | Цитировать Сообщить модератору
 Re: помогите с UNPIVOT'ом  [new]
Glory
Member

Откуда:
Сообщений: 104760
http://technet.microsoft.com/ru-ru/library/ms177410(v=sql.105).aspx
8 авг 14, 13:04    [16416825]     Ответить | Цитировать Сообщить модератору
 Re: помогите с UNPIVOT'ом  [new]
Kill_Maker
Member

Откуда:
Сообщений: 19
пытался так

select Filed_Name, Value
from
(
select top 1 Field_1, Field_2 , Field_3
from t_Table) as SourceTable
unpivot
(
Value FOR Filed_Name IN (Field_1, Field_2 , Field_3)
)AS Unpvt

говорит

Msg 8167, Level 16, State 1, Line 8
The type of column "Field_2" conflicts with the type of other columns specified in the UNPIVOT list.
8 авг 14, 13:06    [16416847]     Ответить | Цитировать Сообщить модератору
 Re: помогите с UNPIVOT'ом  [new]
Glory
Member

Откуда:
Сообщений: 104760
Kill_Maker
The type of column "Field_2" conflicts with the type of other columns

Значит прведенная вами структура таблицы
Field_1 varchar(100),
Field_2 varchar(100),
Field_3 varchar(100)
не соответсвует действительности
8 авг 14, 13:11    [16416891]     Ответить | Цитировать Сообщить модератору
 Re: помогите с UNPIVOT'ом  [new]
mrGuest
Guest
Kill_Maker,

Что-то никак не пойму, я взял Ваш запрос. Выполнил и получил результат, который вы в первом посте указали.
Может Вы привели не весь свой запрос и ошибка кроется в другой его части?
8 авг 14, 13:12    [16416897]     Ответить | Цитировать Сообщить модератору
 Re: помогите с UNPIVOT'ом  [new]
o-o
Guest
ну, значит нам предъявили не ту таблицу, что в запросе участвует.
в реальной таблице у Field_2 тип, отличный от Field_1 , Field_3,
чего бы серверу врать-то
8 авг 14, 13:14    [16416910]     Ответить | Цитировать Сообщить модератору
 Re: помогите с UNPIVOT'ом  [new]
Kill_Maker
Member

Откуда:
Сообщений: 19
в оригинальной все варчары только у них размерность разная,
это критично??
8 авг 14, 14:09    [16417361]     Ответить | Цитировать Сообщить модератору
 Re: помогите с UNPIVOT'ом  [new]
o-o
Guest
вот про это сервер и сообщил.
откастите все к наибольшему в запросе, проблема уйдет
8 авг 14, 14:19    [16417443]     Ответить | Цитировать Сообщить модератору
 Re: помогите с UNPIVOT'ом  [new]
Glory
Member

Откуда:
Сообщений: 104760
Kill_Maker
в оригинальной все варчары только у них размерность разная,
это критично??

А как вы думаете, серер за вас может решить, какаго типа должен быть поле с результатом UNPIVOT-а ?
8 авг 14, 14:20    [16417455]     Ответить | Цитировать Сообщить модератору
 Re: помогите с UNPIVOT'ом  [new]
o-o
Guest
create table t_Table
(
Field_1 varchar(100),
Field_2 varchar(5),
Field_3 varchar(100)
)

insert into t_Table
select 'один', 'два', 'три'

select Filed_Name, Value
from
(
select top 1 Field_1, cast(Field_2 as varchar(100)) as Field_2, Field_3
from t_Table) as SourceTable
unpivot
(
Value FOR Filed_Name IN (Field_1, Field_2, Field_3)
)AS Unpvt
8 авг 14, 14:23    [16417484]     Ответить | Цитировать Сообщить модератору
 Re: помогите с UNPIVOT'ом  [new]
Kill_Maker
Member

Откуда:
Сообщений: 19
привел к конвертом к одной размерности заработало

всем спасибо
8 авг 14, 14:23    [16417485]     Ответить | Цитировать Сообщить модератору
 Re: помогите с UNPIVOT'ом  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
Glory
А как вы думаете, серер за вас может решить, какаго типа должен быть поле с результатом UNPIVOT-а ?


ну, скажем, в случае union он вполне себе успешно решает, какого типа будет результирующий столбец (про выражения я уж молчу). странно, что на pivot все то же не распространили.
8 авг 14, 16:04    [16418427]     Ответить | Цитировать Сообщить модератору
 Re: помогите с UNPIVOT'ом  [new]
o-o
Guest
daw,

ага, а в рекурсивном CTE тот же UNION, но почему-то успешно не решает.
мне за CTE обиднее, чем за UNPIVOT
8 авг 14, 16:08    [16418455]     Ответить | Цитировать Сообщить модератору
 Re: помогите с UNPIVOT'ом  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
o-o
daw,

ага, а в рекурсивном CTE тот же UNION, но почему-то успешно не решает.
мне за CTE обиднее, чем за UNPIVOT


ну, там это можно попытаться объяснить, хотя бы. результирующий тип должен определяться уже при построении плана, а в случае с рекурсивным CTE точно определить тип, если делать это в соответствии с обычными правилами, до полного выполнения не всегда получится (если говорить о максимальной длине строки или precision/scale) - если это выражение с участием столбца из рекурсивной части он будет зависеть от количества итераций.
с unpivot таких проблем, вроде, не просматривается.
8 авг 14, 16:27    [16418628]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: помогите с UNPIVOT'ом  [new]
vlv74
Member

Откуда: Брянск
Сообщений: 73
Коллеги!
подскажите, что я делаю не так.

задача
1. получить данные из AD - успешно
2. преобразовать таблицу к новому виду, для дальнейшей обработки. - работает частично

запрос в принципе работает, но если добавлять некоторые поля (или комбинации) то выдаёт ошибку

The type of column "msrtcsip-userenabled" conflicts with the type of other columns specified in the UNPIVOT list.

как я понял тип поля "msrtcsip-userenabled" несоответствует типам других полей
я попробовал изменить тип поля и сделать все одинаковыми, ошибка осталась.
а вот и сам запрос:
SELECT [cn], [Atrebut], [Val]
FROM (SELECT  cast([cn] as nchar(100)) as [cn], 
              cast([sAMAccountName] as nchar(100)) as [sAMAccountName],
	      cast([msrtcsip-userenabled] as nchar(100)) as [msrtcsip-userenabled]
	  FROM OPENQUERY(ADSI,'SELECT cn,samaccountname,msrtcsip-userenabled FROM ''LDAP://DC=Domen,DC=ru'' where objectCategory=''person'' and (cn=''Василий Попов'') ')) p 
UNPIVOT ([Val] FOR [Atrebut] IN ([samaccountname],[msrtcsip-userenabled]))AS unpvt order by [cn]


пробовал по отдельности поля, работает:
SELECT [cn], [Atrebut], [Val]
FROM (SELECT  cast([cn] as nchar(100)) as [cn], 
              cast([sAMAccountName] as nchar(100)) as [sAMAccountName],
	      cast([msrtcsip-primaryuseraddress] as nchar(100)) as [msrtcsip-primaryuseraddress]
	  FROM OPENQUERY(ADSI,'SELECT cn,samaccountname,msrtcsip-primaryuseraddress FROM ''LDAP://DC=Domen,DC=ru'' where objectCategory=''person'' and (cn=''Василий Попов'') ')) p 
UNPIVOT ([Val] FOR [Atrebut] IN ([samaccountname],[msrtcsip-primaryuseraddress]))AS unpvt order by [cn]

Василий Попов -- sAMAccountName -- V.Popov
Василий Попов -- msrtcsip-primaryuseraddress -- sip:V.Popov@Domen.ru

SELECT [cn], [Atrebut], [Val] 
FROM (SELECT  cast([cn] as nchar(1000)) as [cn],
              cast([msrtcsip-userenabled] as nchar(1000)) as [msrtcsip-userenabled] 
      FROM OPENQUERY(ADSI,'SELECT cn,msrtcsip-userenabled FROM ''LDAP://DC=Domen,DC=ru'' where objectCategory=''person'' and (cn=''Василий Попов'') ')) p 
UNPIVOT ([Val] FOR [Atrebut] IN ([msrtcsip-userenabled]))AS unpvt order by [cn]

Василий Попов -- msrtcsip-userenabled -- 1
12 май 16, 11:40    [19162658]     Ответить | Цитировать Сообщить модератору
 Re: помогите с UNPIVOT'ом  [new]
vlv74
Member

Откуда: Брянск
Сообщений: 73
Всем спасибо.
разобрался сам.

проблема в collate, привёл всё к одному типу заработало

SELECT [cn], [Atrebut], [Val] 
FROM (SELECT  cast([cn] as nvarchar(1000)) collate Cyrillic_General_CI_AS as [cn]
            , cast([samaccountname] as nvarchar(1000)) collate Cyrillic_General_CI_AS as [samaccountname]
	    , cast([msrtcsip-userenabled] as nvarchar(1000)) collate Cyrillic_General_CI_AS as [msrtcsip-userenabled]
	  FROM OPENQUERY(ADSI,'SELECT cn,samaccountname,msrtcsip-userenabled FROM ''LDAP://DC=agrohold,DC=ru'' where objectCategory=''person'' and (cn=''Василий Попов'') ')) p 
UNPIVOT ([Val] FOR [Atrebut] IN ([samaccountname],[msrtcsip-userenabled]))AS unpvt order by [cn]
12 май 16, 12:04    [19162855]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить