mssql에서 쿼리작성시 피벗은 원래 1개의 열만 대상이 된다.
피벗을 사용할때는 일반적이라면 잘사용하지 않지만 이게 사용될때가
보통 보고서를 작성해야할때 피벗을 많이 사용하게 된다. 이 피벗을
사용할때는 pivot( 집계함수(집계대상), For(집계열) in ([열구분1], [열구분2], [열구분3] ...) )
요로코롬 피벗을 사용하면 행이 열로 나열되면서 표시되고 사용하면된다.
근데.. 문제가 이 피벗의 대상컬럼이 2개이상 이였을때 문제가 생기는데 요걸 오또케 해결
할려고 하면 쿼리가 변태처럼 괴랄해진다.
이때는 pivot() 을 사용하고 바로 이어서 pivot() 을 사용하면 되는데.. 문제는 집계열에
해당하는 부분이 앞서 pivot에 사용되었다면 뒤이어서 나오는 pivot에 해당열을 pivot의
for로 사용하지 못한다.
그래서 꼼수를 부려야하는데 이건 for에 해당하는 부분을 숫자나 문자로 변형한 다음
2번째 pivot부터 for의 대상으로 사용하면 된다.
[ 뭔소리냐면 ]
가령 예를 들어서 품목이 입고되는 입고테이블이 있는데 이테이블에서 입금액도 같이
입력되어 있다고 치자면 이테이블은 보통 다음 컬럼이 있다.
ProductID, EnterTime, Count, EnterMoney (품목번호, 입고일시, 입고갯수, 입금액)
이걸가지고 만약에 품목번호가 49번이고 2022년 한해 입고갯수와 입금액을
월별로좀 구분해서 갔다주겠나?? 이렇게 부탁하면 다음처럼 괴랄하게 쿼리 날리면된다.
select ProductID as '품목번호',
(Sum(MC1)+Sum(MC2)+Sum(MC3)+Sum(MC4)+Sum(MC5)+Sum(MC6)+Sum(MC7)+Sum(MC8)+Sum(MC9)+Sum(MC10)+Sum(MC11)+Sum(MC12)) as '입고합계',
(Sum(MM1)+Sum(MM2)+Sum(MM3)+Sum(MM4)+Sum(MM5)+Sum(MM6)+Sum(MM7)+Sum(MM8)+Sum(MM9)+Sum(MM10)+Sum(MM11)+Sum(MM12)) as '입금액합계',
Sum(MC1) as '1월입고갯수', Sum(MM1) as '1월입금액',
Sum(MC2) as '2월입고갯수', Sum(MM2) as '2월입금액',
Sum(MC3) as '3월입고갯수', Sum(MM3) as '3월입금액',
Sum(MC4) as '4월입고갯수', Sum(MM4) as '4월입금액',
Sum(MC5) as '5월입고갯수', Sum(MM5) as '5월입금액',
Sum(MC6) as '6월입고갯수', Sum(MM6) as '6월입금액',
Sum(MC7) as '7월입고갯수', Sum(MM7) as '7월입금액',
Sum(MC8) as '8월입고갯수', Sum(MM8) as '8월입금액',
Sum(MC9) as '9월입고갯수', Sum(MM9) as '9월입금액',
Sum(MC10) as '10월입고갯수', Sum(MM10) as '10월입금액',
Sum(MC11) as '11월입고갯수', Sum(MM11) as '11월입금액',
Sum(MC12) as '12월입고갯수', Sum(MM12) as '12월입금액'
from (
select ProductID,
ISNULL([1], 0) as MC1, ISNULL([2], 0) as MC2, ISNULL([3], 0) as MC3, ISNULL([4], 0) as MC4,
ISNULL([5], 0) as MC5, ISNULL([6], 0) as MC6, ISNULL([7], 0) as MC7, ISNULL([8], 0) as MC8, ISNULL([9], 0) as MC9,
ISNULL([10], 0) as MC10, ISNULL([11], 0) as MC11, ISNULL([12], 0) as MC12,
ISNULL([2001], 0) as MM1, ISNULL([2002], 0) as MM2, ISNULL([2003], 0) as MM3, ISNULL([2004], 0) as MM4,
ISNULL([2005], 0) as MM5, ISNULL([2006], 0) as MM6, ISNULL([2007], 0) as MM7, ISNULL([2008], 0) as MM8,
ISNULL([2009], 0) as MM9, ISNULL([2010], 0) as MM10, ISNULL([2011], 0) as MM11, ISNULL([2012], 0) as MM12
from (
select ProductID, momm, (2000+momm) as moms, Sum(Count) as EnterCount, Sum(EnterMoney) as EnterMoney from (
select ProductID, Month(EnterTime) as momm, Count, EnterMoney
from EnterProducts where EnterTime between '2022-01-01' and '2022-12-31' and productID = 49
) as Ent1
group by ProductID, momm
) as orr
pivot (
Sum(EnterCount)
FOR momm in ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12])
) as pivv
pivot (
Sum(EnterMoney)
FOR moms in ([2001],[2002],[2003],[2004],[2005],[2006],[2007],[2008],[2009],[2010],[2011],[2012])
) as pivv2
) as AAA group by ProductID
이렇게 for에 해당하는 부분을 월단위로 나타낼 momm이 앞서 사용되었으니까
momm에 2000을 더하고 별칭을 moms로 하여 이 열을 for로 사용하면 된다.
댓글 없음:
댓글 쓰기