Sql server 2008 r2 按年划分

Sql server 2008 r2 按年划分,sql-server-2008-r2,Sql Server 2008 R2,我有一张这样的年表。每年有12个值(固定) 我想输出为 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

我有一张这样的年表。每年有
12个
(固定)

我想输出为

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和Partitioned,但都没有成功。

我建议动态填充一个表,其中包含从2013年12月到您喜欢的年份的日期值(您可以更改@COUNT_Y变量以添加更多年份)

SQL有一些有趣的datetime函数,比如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, -@COUNT_X, DATEADD(YEAR,-@COUNT_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
DECLARE@DATES表
(
xDATE日期时间
)
声明@STARTDATE DATETIME='12-31-2013'
声明@COUNT_X INT=0
声明@COUNT\u X\u MAX INT=11
声明@COUNT_Y INT=0
声明@COUNT_Y_MAX INT=2
而(@COUNT_YTru使用

--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)
这是我的会计表,其中Fyear是一个会计年度。我有
12个
值,每个值表示月份。+1您的解决方案非常好,但我认为我的问题可以使用函数解决(我以前从未听说过)正如阿迪蒂亚所建议的那样,我将投票表决。因此,我将把阿迪蒂亚的回答作为我的回答。
。继续做好工作。
--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)