2013-04-24 78 views
2

我有一个年表这样。每年都有12(固定)按年划分

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') 

我想输出

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 

我如何能做到这一点的SQLServer2008R2。我曾尝试使用DenseRank,RowNuber,分区,但都是徒劳的。

回答

5

的Tru 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 2013-04-24 13:54:06

+0

它工作。感谢您的解决方案。 – Luv 2013-04-25 05:34:59

1

我建议动态填充日期值从2013年12月下降到你喜欢的年份(可以改变@COUNT_Y变量以添加更多年份)。

SQL有一些有趣的日期时间的功能,如DATEPART哪位能告诉你一个月是季度等

**回答改为使用引起质疑变化**

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是财政年**。我有'12'值,每个值表示**月**。 – Luv 2013-04-24 13:46:58

+0

请参阅我的更新问题 – Luv 2013-04-24 13:54:25

+0

+1您的解决方案如果非常好**,但我认为我的问题可以使用**函数解决(我从未听过)NTILE **,如Aditya * *。所以我是'投票'Aditya答案作为我的**'答案**。继续做好工作。 – Luv 2013-04-25 05:34:20