2013-08-23 5 views
0

MS-SQL 사용 조건부 크로스 탭 쿼리를 작성하는 가장 좋은 방법은 찾고있는 가장 좋은 방법이라고 생각합니다.SQL Server 조건부 크로스 탭

여기에서 간단히 설명하면 CLIENTS (각각 고유 ID가있는 데이터 세트)가 있습니다. 이 클라이언트들 각각은 팀에 배정됩니다. 대부분의 고객은 단 한 팀에만 할당되지만 일부는 2 개, 3 개 또는 5 개 팀으로 할당 될 수 있습니다. 내 쿼리 결과는 다음과 같이하고 싶습니다 :

Client_ID Assigned_Team1 Assigned_Team2 Assigned_Team3 Assigned_Team4 Assigned_Team5 
--------- -------------- -------------- -------------- -------------- -------------- 
87496  Red Team  Null   Null   Null   Null 
74559  Red Team  Blue Team  White Team  Null   Null 
56345  Blue Team  Green Team  Null   Null   Null 
21473  Yellow Team  Blue Team  White Team  Red Team  Green Team 

답변

1

당신이 row_number()을 사용하기를 원할 것입니다 결과를 얻기 위하여. row_number는 client_id의 각 팀에 순차 값을 지정하는 데 사용됩니다. 그런 다음이 순차 번호를 사용하여 결과를 열로 변환합니다. 데이터 행을 열로 변환 할 수있는 몇 가지 방법이 있습니다. (참고 : 나는 테이블 구조에 추측 오전)

당신은 CASE 표현식으로 집계 함수를 사용할 수 있습니다

select client_id, 
    max(case when seq = 1 then team end) Assigned_Team1, 
    max(case when seq = 2 then team end) Assigned_Team2, 
    max(case when seq = 3 then team end) Assigned_Team3, 
    max(case when seq = 4 then team end) Assigned_Team4, 
    max(case when seq = 5 then team end) Assigned_Team5 
from 
(
    select client_id, team, 
    row_number() over(partition by client_id order by team) seq 
    from clients 
) d 
group by client_id; 

SQL Fiddle with Demo를 참조하십시오.

아니면 PIVOT 기능을 사용할 수 있습니다

select client_id, 
    [1] Assigned_Team1, 
    [2] Assigned_Team2, 
    [3] Assigned_Team3, 
    [4] Assigned_Team4, 
    [5] Assigned_Team5 
from 
(
    select client_id, team, 
    row_number() over(partition by client_id order by team) seq 
    from clients 
) d 
pivot 
(
    max(team) 
    for seq in ([1], [2], [3], [4], [5]) 
) piv; 

SQL Fiddle with Demo

를 참조하십시오