2013-04-24 2 views
2

나는 년 테이블 이렇게 있습니다. 매년 내가 SQLServer2008R2에서 그렇게 할 수있는 방법년까지 분할했습니다

FYear Month Qt Qtp 
2011 Jan  1 1 
2011 Feb  1 2 
2011 Mar  1 3 
2011 Apr  2 1 
2011 May  2 2 
2011 Jun  2 3 
2011 Jul  3 1 
2011 Aug  3 2 
2011 Sep  3 3 
2011 Oct  4 1 
2011 Nov  4 2 
2011 Dec  4 3 
2012 Jan  1 1 
2012 Feb  1 2 
2012 Mar  1 3 
2012 Apr  2 1 
2012 May  2 2 
2012 Jun  2 3 
2012 Jul  3 1 
2012 Aug  3 2 
2012 Sep  3 3 
2012 Oct  4 1 
2012 Nov  4 2 
2012 Dec  4 3 
2013 Jan  1 1 
2013 Feb  1 2 
2013 Mar  1 3 
2013 Apr  2 1 
2013 May  2 2 
2013 Jun  2 3 
2013 Jul  3 1 
2013 Aug  3 2 
2013 Sep  3 3 
2013 Oct  4 1 
2013 Nov  4 2 
2013 Dec  4 3 

로 출력하고자

declare @t table (FiscalYear int,[Month] varchar(25)) 
insert into @t values 
(2011,'Jan'),(2011,'Feb'),(2011,'Mar'),(2011,'Apr'), 
(2011,'May'),(2011,'Jun'),(2011,'Jul'),(2011,'Aug'), 
(2011,'Sep'),(2011,'Oct'),(2011,'Nov'),(2011,'Dec'), 
(2012,'Jan'),(2012,'Feb'),(2012,'Mar'),(2012,'Apr'), 
(2012,'May'),(2012,'Jun'),(2012,'Jul'),(2012,'Aug'), 
(2012,'Sep'),(2012,'Oct'),(2012,'Nov'),(2012,'Dec'), 
(2013,'Jan'),(2013,'Feb'),(2013,'Mar'),(2013,'Apr'), 
(2013,'May'),(2013,'Jun'),(2013,'Jul'),(2013,'Aug'), 
(2013,'Sep'),(2013,'Oct'),(2013,'Nov'),(2013,'Dec') 

(고정) 12 값이 있습니다. 나는 DenseRank, RowNuber, 파티션을 사용하려했지만 모두 헛된 것입니다.

답변

5

트루을 변화를 질문으로 인해 변경 등으로 인 분기 말할 수 DATEPART와 같은 몇 가지 흥미로운 날짜 기능이 Ntile :

--select * from @t  
SELECT * , 
ROW_NUMBER() OVER (PARTITION BY FYear, Qt ORDER BY FYear) Qtp 
from 
(SELECT FYear,[Month], 
NTILE(4) OVER (PARTITION BY FYear ORDER BY FYear) AS Qt 
FROM @t) PERIOD 
ORDER BY FYear ,Qt ,ROW_NUMBER() OVER (PARTITION BY FYear, Qt ORDER BY FYear) 
+0

내 업데이 트를 참조하십시오 질문 – Luv

+0

그것은 효과가있다. 솔루션을 가져 주셔서 감사합니다. – Luv

1

나는 당신이 좋아하는 연도로 내려가는 2013 년 12 월의 날짜 값으로 표를 동적으로 채우는 것을 제안합니다. @COUNT_Y 변수를 변경하여 더 많은 년을 추가 할 수 있습니다.

SQL은 한 달

** 응답 사용 **

DECLARE @DATES TABLE 
    (
     xDATE DATETIME 
    ) 

    DECLARE @STARTDATE DATETIME = '12-31-2013' 

    DECLARE @COUNT_X INT = 0 
    DECLARE @COUNT_X_MAX INT = 11 

    DECLARE @COUNT_Y INT = 0 
    DECLARE @COUNT_Y_MAX INT = 2 

    WHILE (@COUNT_Y <= @COUNT_Y_MAX) 
    BEGIN 

     SET @COUNT_X = 0 

     WHILE (@COUNT_X <= @COUNT_X_MAX) 
     BEGIN 

      INSERT INTO @DATES 
      SELECT DATEADD(MONTH, [email protected]_X, DATEADD(YEAR,[email protected]_Y, @STARTDATE)) 

      SET @COUNT_X = @COUNT_X + 1 
     END 

     SET @COUNT_Y = @COUNT_Y + 1 
    END 

    SELECT * FROM 
    (SELECT 
    DATEPART(YEAR, D.xDATE) AS [YEAR], 
    DATEPART(MONTH, D.xDATE) AS [MONTH], 
    DATENAME(MONTH, D.xDATE) AS [MONTH_NAME], 
    DATEPART(QUARTER, D.xDATE) AS [QUARTER], 
    DATEPART(MONTH, D.xDATE) - (3 * (DATEPART(QUARTER, D.xDATE) - 1)) AS [QTP] 
    FROM @DATES D) t 
    ORDER BY T.YEAR, T.MONTH 
+0

Fyear가 회계 연도 ** 인 my ** 회계 테이블 **. 그리고 나는'12' 값을 가지고 있는데, 각각은 ** month **입니다. – Luv

+0

내 업데이트 된 질문을 참조하십시오 – Luv

+0

+1 솔루션 ** 매우 ** 멋진 **하지만 내 문제는 ** 기능을 사용하여 해결할 수있을 것 같아요 (전에는 들어 본 적이없는) NTILE **, ** Aditya * *. 그래서 나는 ** 대답 **으로 Aditya 대답을 투표하고있다. ** **. 선한 일을 계속하십시오. – Luv

관련 문제