[mssql] pivot 사용하기

ony·2023년 4월 4일
1

이렇게 되는데... ?
내는 이렇게 되어 있으면 안된다..

이렇게 만들어야 차트에 사용하기가 편하다.

어케하냐..

chatGPT 보다 더 확실한 우당탕탕 개발자 지인톡방

피벗 을 아예 생각하지도 못하고 있었는데.. 가보자고

PIVOT 문법

SELECT *
  FROM ( 피벗할 쿼리문 ) AS result
 PIVOT ( 그룹합수(집계컬럼) FOR 피벗대상컬럼 IN ([피벗컬럼값] ... ) AS pivot_result

참고1. 서브쿼리에는 order by 같은 거 집어 넣으면 안됨. 오류 터진다.
참고2. 그룹함수는 SUM(), COUNT(), AVG() 등을 사용할 수 있다.
참고3. 피벗컬럼값은 한번 지정하면 데이터가 존재하지 않아도 고정적으로 출력된다.
참고4. 피벗컬럼값의 대괄호([ ])는 존재해야 한다.
참고5. FROM절과 PIVOT절의 별칭(result, pivot_result)은 꼭 붙여줘야 오류가 발생하지 않는다.

멋대로 바꿔쓰지 말자.
왜냐면 내가 그렇게 해서 시간 허비를 했기 때문이다
🫥🐶

사용 예제

select * 
from 
	(
	select s.STATUS_NM as 'NAME'
	,	case
		when datediff(week, a.CREATE_DATE, getdate()) <= 1 THEN '1'
		when datediff(week, a.CREATE_DATE, getdate()) <= 2 THEN '2'
		when datediff(week, a.CREATE_DATE, getdate()) <= 3 THEN '3'
		else '4'
		end as 'WEEKRANGE', COUNT(a.STATUS_ID) AS 'NUM'
		from [SFKR_ISS].dbo.ARTICLE a WITH(NOLOCK)
			join [SFKR_ISS].dbo.STATUS s ON a.STATUS_ID = s.STATUS_ID
		where a.ORG_ID = '1'
                AND a.CREATE_DATE BETWEEN '1989-01-01' AND '2023-04-04'
                --AND a.USE_YN = 'Y'
		group by a.STATUS_ID, s.STATUS_NM, case
		when datediff(week, a.CREATE_DATE, getdate()) <= 1 THEN '1'
	when datediff(week, a.CREATE_DATE, getdate()) <= 2 THEN '2'
	when datediff(week, a.CREATE_DATE, getdate()) <= 3 THEN '3'
	else '4'
	end
	) as result
	PIVOT (
	sum(NUM) FOR WEEKRANGE IN ([4],[3],[2],[1]) 
	) as pivot_result

도움이 될란가는 모르지만 대충 이렇게 사용했고,

결과

깔끔해졌다.

만약에 저 이름이 변동적으로 바꿔져야하면 동적쿼리로 짜야하지만 나는 4,3,2,1 로 픽스된 값들이어서.. 그냥 피벗으로 변경했다.
다음에 기회가 된다면 동적쿼리도 포스팅해보도록 하겠다.

profile
파이(π)형 개발자 🎐🌿🤍

0개의 댓글