2014-12-09 2 views
2

테이블의 unpivot에 도움이 필요합니다.테이블을 두 번 unpivot하려면 어떻게합니까?

unpivot(Username for Role in ([User_RoleX], [User_RoleY], [User_RoleZ])) as result 

그리고 다음을 얻을 :이 같은 유사한 구조 (UserRoles 날짜가 작성되지 않습니다 사실, 널 (NULL))

Object User_RoleX User_RoleY User_RoleZ RoleX_Date RoleY_Date 
====== =========== ========== ========== ========== ========== 
O1  User 1  User 2  User 3  2014-12-08 2013-12-09 
O2  NULL  User 1  User 2  NULL  2013-12-09 
O3  User 1  NULL  User 1  2014-12-08 NULL 

내가 다음 명령을 사용하여이 테이블을 피벗 해제에 테이블이 결과 : (나는 Datecolumns 나중에이 테이블에 왔기 때문에,이 얻을 및 UNPIVOT 명령이이 날짜 컬럼 용으로 설계되지 않은)

Object Username Role  RoleX_Date RoleY_Date 
====== ========== ========== ========== ============ 
O1  User1  X   2014-12-08 2013-12-09 
O1  User2  Y   2014-12-08 2013-12-09 
O1  User3  Z   2014-12-08 2013-12-09 

O2  User1  Y   NULL  2013-12-09 
O2  User2  Z   NULL  2013-12-09 

O3  User1  X   2014-12-08 NULL 
O3  User1  Z   2014-12-08 NULL 
결과는 다음대로 내가 원하는 무엇

,하지만 난 나는 UNPIVOT 문에서 2 개 날짜 열을 삽입 할 때 UNPIVOT 명령이하지 않는

Object Username Role  Date 
====== ========== ========== ========== 
O1  User1  X   2014-12-08 
O1  User2  Y   2013-12-09 
O1  User3  Z   (NullOrEmpty) 

O2  User1  Y   2013-12-09  
O2  User2  Z   (NullOrEmpty)   

O3  User1  X   2014-12-08 
O3  User1  Z   (NullOrEmpty) 

을 (역할 Z는 날짜가없는), 나는라는 오류 메시지를받을 날짜는 열이 unpivot-list에 선언 된 다른 열의 유형과 충돌합니다.

누군가가이 예상 된 경우에 대해 unpivot 명령을 편집하는 방법에 대한 힌트를 줄 수 있습니다.

답변

1

당신은 CTE로 기존의 결과를 사용하고 노동 조합을 사용할 수 있습니다 ..

With X as 
(
    -- current statement 
) 
Select Object, UserName, Role, RoleX_Date as Date 
From X 
Union All 
Select Object, UserName, Role, RoleY_Date as Date 
From X 

결과는 당신이 당신이 예상 쓴 정확히되지 않습니다 ..하지만 정말 결과 뒤에 논리를하지 않습니다. 이것은 약간의 아이디어를 줄 수도 있지만 ..

+0

쉽게 연결된 열을 분할 할 수 있습니다 결과에서

Select Column1, Column2 + '|' + Column3 From Table 

은 ... 당신의 노력을 주셔서 대단히 감사합니다,하지만 내 요구 사항은 그래서 주제를 닫을 수 있습니다 변경되었습니다. – Flopo

2

실제로 여러 개의 열을 함께 unpivot하려면 CROSS APPLY를 사용하는 것이 좋습니다. CROSS는 UNION ALL이나 값으로 적용 사용하면 2005

논리는 다음 UNION ALL을 사용하여 유사합니다 SQL 서버부터 이용할 수있게했다 :

select 
    t.object, 
    c.Username, 
    c.Role, 
    c.Date 
from yourtable t -- or query 
cross apply 
(
    select 'X', User_RoleX, RoleX_Date union all 
    select 'Y', User_RoleY, RoleY_Date union all 
    select 'Z', User_RoleZ, null 
) c (Role, UserName, Date); 

SQL Fiddle with Demo를 참조하십시오. 추가 필터링이 필요한 경우 WHERE 절을 포함시킬 수 있습니다. 당신은 VALUES 절을 사용하고자하는 경우

, 당신은 사용한다 :

select 
    t.object, 
    c.Username, 
    c.Role, 
    c.Date 
from yourtable t 
cross apply 
(
    values 
    ('X', User_RoleX, RoleX_Date), 
    ('Y', User_RoleY, RoleY_Date), 
    ('Z', User_RoleZ, null) 
) c (Role, UserName, Date); 

SQL Fiddle with Demo를 참조하십시오. 모두 비슷한 결과를 제공 :

| OBJECT | USERNAME | ROLE |       DATE | 
|--------|----------|------|---------------------------------| 
|  O1 | User 1 | X | December, 08 2014 00:00:00+0000 | 
|  O1 | User 2 | Y | December, 09 2013 00:00:00+0000 | 
|  O1 | User 3 | Z |       (null) | 
|  O2 | (null) | X |       (null) | 
+0

노력에 감사드립니다.하지만 제 요구 사항이 변경되어 주제가 닫힐 수 있습니다. – Flopo

0

두 번 또는 여러 번, 가장 쉬운 방법은 당신이 사이에 구분 기호로 피벗 해제하려고하는 열을 연결하는 피벗 해제 (또는 피벗)를 선택합니다 :