[sql] 열 이름으로 피벗 해제

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



답변

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

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

데모가있는 SQL Fiddle 참조


답변

다음 코드와 함께 일련의 논리를 사용하여 표준 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;

답변

학생 선택 *

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


답변

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

select name, Subject, Marks
from studentmarks
Cross Join (
values (Maths,'Maths'),(Science,'Science'),(English,'English')
) un(Marks, Subject)
where marks is not null;


답변