뭉
노재능 록리형 개발자
뭉
전체 방문자
오늘
어제
  • 분류 전체보기 (27)
    • Java (18)
      • Grammer (14)
      • Problem Solving (4)
    • JavaScript (0)
      • Grammer (0)
      • jQuery (0)
    • Spring (0)
    • DB (9)
      • SQL (6)
      • JPA (3)
    • Storage (0)
    • ETC (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
뭉

노재능 록리형 개발자

PIVOT~FOR
DB/SQL

PIVOT~FOR

2022. 3. 1. 06:59

열값들을 컬럼으로 바꾸려 할 때 우리는 PIVOT~FOR을 사용합니다.

하지만 그에 대한 대가가 따르는 법. 강제로 컬럼을 만들기 때문에 테이블 구조가 바뀌게 됩니다.

이때 바뀔 구조는 값들로 쓰일 컬럼(NAME)을 제외한 나머지 컬럼(POSITION, HP) 값들이 서로 그룹화한 조합들로 이루어져 있습니다.

 

이를 문법으로 표현하면 다음과 같습니다.

SELECT * FROM TABLE
PIVOT (집계함수(값으로 사용할 컬럼) FOR {열로 변환할 컬럼} IN ([열의 이름], [열의 이름], ...)) AS {별칭}
-- 반드시 별칭을 반드시 붙여야 한다!​

우리는 80, 100, 200을 컬럼으로 바꾸려 합니다.

그러면 먼저 HP를 제외한 컬럼 중 하나를 선택해 80, 100, 200의 값이 되어줄 컬럼을 찾습니다.

위에서는 NAME을 선택했습니다.

 

그러면 HP와 NAME을 제외한 컬럼들의 값은 서로 묶여 TOP, JG, SUP과 같이 그룹화된다.

이때 NAME에는 집계함수가 적용되는데 나머지 컬럼들이 서로 그룹화가 되면서 컬럼들의 값이 여러개가 선택되는 경우가 있기에 사용합니다.

그리고 80, 100, 200과 TOP, JG, SUP의 조합하는 테이블이 만들어지고 그 값은 NAME 값에 집계함수를 사용한 값입니다.

SELECT * FROM CHAMPION	-- POSITION, [80], [100], [200]
PIVOT (MAX(NAME) FOR HP IN ([80], [100], [200])) AS B

이때 조합하여 나타낼 값들이 문자열이라면 MAX나 MIN를 사용해야 하며, 다른 집계함수들은 타입 때문에 결과값이 나오지 않음을 주의하셔야 합니다.

만약 SELECT절에서 컬럼으로 바꾼 값들을 표현하려면 대괄호 []를 사용해 표현하면 됩니다.

 

만약 80, 100, 200과 같은 값들이 100개가 있다면 어떻게 할까요?

이럴 때는 [80], [100], [200]이란 값을 동적으로 만들어 쿼리를 실행시켜줘야 합니다.

DECLARE @P_COL VARCHAR(MAX)

SET @P_COL = ''

SELECT @P_COL = @P_COL + '['+ CAST(HP AS VARCHAR) +'],' 
FROM CHAMPION GROUP BY HP	--[80], [100], [200],

SET @P_COL = LEFT(@P_COL, LEN(@P_COL) - 1)	--마지막 문자 제거

EXEC ('SELECT * FROM CHAMPION 
		PIVOT (MAX(NAME) FOR HP IN(' + @P_COL + ')) AS A')	--동적쿼리 실행

 

'DB > SQL' 카테고리의 다른 글

CTE  (0) 2022.03.12
STRING_AGG와 STUFF~FOR XML PATH  (0) 2022.02.27
EXISTS  (0) 2022.02.27
CASE WHEN과 IIF  (0) 2022.02.27
ISNULL  (0) 2022.02.27
    'DB/SQL' 카테고리의 다른 글
    • CTE
    • STRING_AGG와 STUFF~FOR XML PATH
    • EXISTS
    • CASE WHEN과 IIF
    뭉
    뭉
    노재능 록리형 개발자

    티스토리툴바