[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 해제 해제 방법을 시도 할 수도 있습니다. 다음 코드에는 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;