pivot 동적.. 0 1 1,083

by 느림보 [SQL Query] [2018.11.29 15:28:11]


  DECLARE @INDATE      CHAR(8)
  SET @INDATE = LEFT(CONVERT(varchar, GetDate(),112),6) - 9

SELECT * FROM (
	SELECT LEFT(A.INVOICEDATE, 6) AS INDATE, B.ITEMSEQ ,  SUM(B.QTY) AS QTY FROM SINVOICE A, SINVOICEITEM B 
		WHERE A.INVOICESEQ = B.INVOICESEQ
			
			AND A.INVOICEDATE BETWEEN @INDATE AND GETDATE()
		GROUP BY  LEFT(A.INVOICEDATE, 6), B.ITEMSEQ

) A 
PIVOT( SUM(QTY) FOR  INDATE IN ([201802],[201803],[201804],[201805])) AS RESULTPIVOT;

여기에서 PIVOT INDATE를 동적으로 조회조건 기준으로 나오게 하려면 어떻게 해야할까요?  현재는 2018년 1월부터 11월까지이나 현재 기준에서 10개월 이전 DATA를

끌고오게 할거라서요..

 

 

by 마농 [2018.11.30 08:26:13]

사용하신 9 를 빼는 방법은 잘못된 방법입니다.
현재월이 201811 이라 201802 가 나왔지만?
201901 월이라면? 201892 가 나올 것입니다.
10개월 고정이라면?
년월은 가변적으로 변하는 값이니, 고정값인 개월수로 피벗하세요.
 

SELECT *
  FROM (SELECT DATEDIFF(m, CONCAT(CONVERT(VARCHAR(6), DATEADD(m, -9, GetDate()), 112), '01')
                         , CONCAT(LEFT(a.invoicedate, 6)                             , '01')
                         ) + 1 AS m
             , b.itemseq
             , b.qty
          FROM sinvoice a
         INNER JOIN sinvoiceitem b 
            ON a.invoiceseq = b.invoiceseq
         WHERE a.invoicedate >= CONVERT(VARCHAR(6), DATEADD(m, -9, GetDate()), 112)
           AND a.invoicedate <= CONVERT(VARCHAR(8),                GetDate() , 112)
        ) a
 PIVOT( SUM(qty) FOR m IN ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10])) a
;

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입