728x90
Cross-Tab 쿼리 생성시 대개 SP에서 처리(Temp테이블 이용)하는것과 동일한
결과 내는 방법입니다.
(Pubs DB이용)
방법1>
SELECT DatePart(yy, Ord_date)년도, SUM( Qty) AS Total,
  SUM(CASE DATEPART(qq,  Ord_date) WHEN 1 THEN  Qty  ELSE 0 END) AS [1분기],
  SUM(CASE DATEPART(qq,  Ord_date) WHEN 2 THEN  Qty  ELSE 0 END) AS [2분기],
  SUM(CASE DATEPART(qq,  Ord_date) WHEN 3 THEN  Qty  ELSE 0 END) AS [3분기],
  SUM(CASE DATEPART(qq,  Ord_date) WHEN 4 THEN  Qty   ELSE 0 END) AS [4분기]
FROM Sales 
GROUP BY DatePart(yy, Ord_date )
Order by 1 

방법2>
SELECT DatePart(yy, Ord_date)년도,  SUM( Qty) AS Total,
  SUM(Qty * (1-ABS(SIGN(DatePart(qq, Ord_date)-1)))) AS [1분기],
  SUM(Qty * (1-ABS(SIGN(DatePart(qq, Ord_date)-2)))) AS [2분기],
  SUM(Qty * (1-ABS(SIGN(DatePart(qq, Ord_date)-3)))) AS [3분기],
  SUM(Qty * (1-ABS(SIGN(DatePart(qq, Ord_date)-4)))) AS [4분기]
From Sales
Group by DatePart(yy, Ord_date)
Order by 1

--------------------------------------------------------
결과 >

년도         Total         1분기         2분기        3분기         4분기
------------------------------------------------------------
1992 80 0 80 0 0
1993 250 60 165 0 25
1994 163 0 0 163 0


* 방법1은 간단한 CASE~WHEN문으로 보시면 아실것 같고,
  방법2의 경우는
(1-ABS(SIGN(DatePart(qq, Ord_date)-1))) 의 경우
각 분기외의 부분은 0으로 처리되어 (Qty * 0), 각분기별로 컬럼이 생성되고
이 컬럼들을 SUM시키게 됩니다.
- ABS와 SIGN 함수는 시퀄내장 함수이므로, 추가적인 사항은
  SQL도움말을 참조하시면 될듯 합니다. 

+ Recent posts