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

でそれを行うにはどうすればよいですかSQLServer2008R2DenseRank、RowNuber、Partitionedを使用してみましたが、すべて無駄でした。

4

2 に答える 2

5

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)
于 2013-04-24T13:43:47.280 に答える
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, -@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
于 2013-04-24T13:43:19.877 に答える