2014-07-14 5 views
0

의 조건이 같은 테이블이 다른 클래스와 모든 이름이 포함되어있는 경우 특정 각 :열 선택 SQL

Name Class 

Jack A 

Nick B 

Simon C 

David B 

Linda B 

Alice C 

을 마우스 오른쪽 단추로 지금은 표를 얻기 위해 원하는 클래스 A, B, C와 해당 클래스의 이름을 포함하는 열로 표시됩니다.

A----------B----------C 

Jack------Nick-------Simon 

----------David------Alice 

----------Linda----------- 

SQL 쿼리에서 이러한 테이블을 어떻게 가져 옵니까? 나쁜 형식으로 미안합니다. 그래서 테이블을 만드는 법을 모른다.

+0

피벗 테이블이 필요합니다. 얼마나 많은 수업이 있는지 모를 경우 동적 피벗 테이블을 찾을 수 있습니다. 그래서 http://sqlhints.com/2014/03/18/dynamic-pivot-in-sql-server/ –

답변

3

다음은 집계를 사용하는 방법입니다. 아마도 가장 쉬운 방법 일 것입니다.

select max(case when class = 'a' then name end) as a, 
     max(case when class = 'b' then name end) as b, 
     max(case when class = 'c' then name end) as c 
from (select name, class, row_number() over (partition by class order by (select NULL)) as seqnum 
     from nameclasses 
    ) nc 
group by seqnum 
order by seqnum; 

이것은 내가 게시 한 원래의 방법입니다. 그것은 집계를 사용하지 않지만, 많은 조인 않습니다

select a.name as a, b.name as b, c.name as c 
from (select name, row_number() over (order by (select NULL)) as seqnum 
     from nameclasses nc 
     where class = 'A' 
    ) a full outer join 
    (select name, row_number() over (order by (select NULL)) as seqnum 
     from nameclasses nc 
     where class = 'B' 
    ) b 
    on a.seqnum = b.seqnum full outer join 
    (select name, row_number() over (order by (select NULL)) as seqnum 
     from nameclasses nc 
     where class = 'c' 
    ) c 
    on c.seqnum = coalesce(a.seqnum, b.seqnum) 
order by coalesce(a.seqnum, b.seqnum, c.seqnum); 
+0

좋은. 비슷한 FULL JOIN 솔루션을 생각해 냈습니다. 집계를 사용하는 것은 나에게 발생하지 않았지만 아마 좋을 것입니다. –

+0

도와 줘서 고마워! 테이블에 엄청난 양의 데이터가 포함되어 있다면 어떤 방법으로 더 빠를까요? – SSilicon

+0

@ 실리콘. . . 그것은 정말로 달려 있습니다. SQL Server는 집계에 꽤 좋습니다. 'class, name'에 대한 색인이 필요합니다. 두 가지 방법으로 시도하고 어떤 일이 발생하는지 확인하십시오. –

1

당신이 요구하고 데이터는 정말 관계 없으며, 이러한 경우에 당신은 보통 일에서 더 나은 결과를 얻을 수 있습니다 클라이언트 응용 프로그램에서 작업하십시오. 하지만 종종 가능하지 않으므로 :

SELECT A.Name as A, B.Name as B, C.Name AS C 
FROM 
    (select Name, row_number over (order by name) as ordinal from table where class = 'A') A 
FULL JOIN 
    (select Name, row_number over (order by name) as ordinal from table where class = 'B') B 
    ON B.ordinal = A.ordinal 
FULL JOIN 
    (select Name, row_number over (order by name) as ordinal from table where class = 'C') C 
    ON C.ordinal = coalesce(A.ordinal, B.ordinal)