열 이름으로 피벗 해제


127

StudentMarks열 이있는 테이블 이 있습니다 Name, Maths, Science, English. 데이터는

Name,  Maths, Science, English  
Tilak, 90,    40,      60  
Raj,   30,    20,      10

다음과 같이 정렬하고 싶습니다.

Name,  Subject,  Marks
Tilak, Maths,    90
Tilak, Science,  40
Tilak, English,  60

함께 UNPIVOT 나는에 소스 테이블의 열 이름을 얻을 수 제대로 마크,하지만 이름을 얻을 수 있어요 Subject원하는 결과 집합의 열을.

어떻게하면 되나요?

나는 지금까지 다음 쿼리에 도달했습니다 (이름, 마크를 얻기 위해)

select Name, Marks from studentmarks
Unpivot
(
  Marks for details in (Maths, Science, English)

) as UnPvt

1
지금까지 한 내용을 게시 할 수 있습니까? 쿼리 / 출력.
Hart CO

답변:


204

검색어가 매우 가깝습니다. subject최종 선택 목록에 포함 된 다음을 사용할 수 있어야 합니다.

select u.name, u.subject, u.marks
from student s
unpivot
(
  marks
  for subject in (Maths, Science, English)
) u;

데모가있는 SQL Fiddle 참조


@bluefeet 이름 (Maths, Science, English)을 지정할 필요가없는 방법이 있습니까? 구조가 동일하지만 열 이름이 다른 많은 테이블 에서이 작업을 수행하고 있습니다.
LBogaardt

1
@LBogaardt 아니요, 포함 할 열을 명시 적으로 정의해야합니다.
jjjjjjjjjjj

@LBogaardt 여기 에서 내 대답을 살펴보십시오 . 열 이름을 지정하지 않고 동적 SQL을 사용하여 피벗을 해제 할 수 있습니다.
Taryn

8

다음 코드와 함께 일련의 논리를 사용하여 표준 SQL 해제 해제 방법을 시도 할 수도 있습니다. 다음 코드에는 3 단계가 있습니다.

  1. 교차 결합을 사용하여 각 행에 대해 여러 개의 사본을 작성합니다 (이 경우 주제 열도 작성).
  2. 열 "마크"를 작성하고 사례 표현식을 사용하여 관련 값을 입력하십시오 (예 : 주제가 과학 인 경우 과학 열에서 값을 선택)
  3. null 조합 제거 (존재하는 경우 기본 테이블에 null 값이 없으면 테이블 표현식을 완전히 피할 수 있음)

     select *
     from 
     (
        select name, subject,
        case subject
        when 'Maths' then maths
        when 'Science' then science
        when 'English' then english
        end as Marks
    from studentmarks
    Cross Join (values('Maths'),('Science'),('English')) AS Subjct(Subject)
    )as D
    where marks is not null;

이것은 모든 RDBMS에서도 작동합니다! 값을 사용할 수없는 경우 SELECT ... UNION ... SELECT ...를 사용하여 하위 쿼리로 대체 할 수 있습니다. CROSS JOIN의 성능이 궁금합니다.
Cristi S.

0

학생 선택 *

UNPIVOT ((Maths, Science, English) 주제의 마크);


1
이것은 이미 거의 6 년 전에 게시 된 승인되고 높은 평가를받은 답변과 동일한 답변입니까?
ImaginaryHuman072889

0

교차 결합을 사용하는 또 다른 방법은 교차 결합 안에 열 이름을 지정하는 것입니다.

select name, Subject, Marks 
from studentmarks
Cross Join (
values (Maths,'Maths'),(Science,'Science'),(English,'English')
) un(Marks, Subject)
where marks is not null;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.