code

열 이름으로 피벗 해제

starcafe 2023. 4. 28. 21:11
반응형

열 이름으로 피벗 해제

자리가 있습니다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을 사용하면 Name, Marks를 제대로 가져올 수 있지만 소스 테이블의 열로 가져올 수 없습니다.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 with 데모 참조

다음 코드를 가진 일련의 논리를 사용하여 표준 sql un-pivoting 방법을 시도할 수도 있습니다.다음 코드는 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;
    

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

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

언급URL : https://stackoverflow.com/questions/19055902/unpivot-with-column-name

반응형