2016-11-29 4 views
0

私はすべてのプロジェクトのために次の5年が必要です 例:プロジェクト番号が1で、そのプロジェクトの開始年が2015で、そのプロジェクトの次の5年が必要です。開始年が2018年である場合にだけそのように別のプロジェクト数2のために、私は2018年から今後5年間必要SQLですべてのプロジェクトの次の5年を取得

予想される出力:ここ

Project number Year 

1----------------2015 

1------------------2016 

1------------------2017 

1-----------------2018 

1------------------2019 

2------------------2018 

2------------------2019 

2------------------2020 

2-------------------2021 

2-----------------2022 

は私が書いたコードですが、それが私を与えていません私が期待したもの事前に

WITH YEARLIST 
AS (SELECT PROJECT_NUMBER 
      ,START_YEAR AS YEAR 
    FROM TABLE_ABC 

    UNION ALL 
    SELECT 
      PROJECT_NUMBER 
      ,Y.YEAR +1 AS YEAR 
      FROM YEARLIST Y 
      WHERE Y.YEAR >= Y.YEAR +5 
    ) 
    SELECT 
     PROJECT_NUMBER 
     ,YEAR 
    FROM YEARLIST 

    OPTION (MAXRECURSION 0) 

おかげ..

+0

現在の出力を提供してください。 – Mitrucho

+0

ループを使用しようとしていますか? –

+0

プロジェクトの開始年を表示するだけです@Mitrucho –

答えて

1

申し訳ありませんが、私はサイトを初めて利用しています。

CREATE TABLE #TMP1(PrId SMALLINT, StrtYr SMALLINT) 

INSERT INTO #TMP1 (PrId,StrtYr) 
VALUES 
(1,2015), 
(2,2018), 
(3,2016), 
(4,2014), 
(5,2017), 
(6,2015) 



SELECT 
    * 
FROM #TMP1 
     CROSS APPLY (VALUES (StrtYr + 1) 
           ,(StrtYr + 2) 
           ,(StrtYr + 3) 
           ,(StrtYr + 4) 
           ,(StrtYr + 5) 
           ) FutureYear(futureyear) 
+0

ありがとう@pacreely ...これは私のために働いた..あなたの答えをありがとう.... –

0
;with cte 
as 
(
select 1 as id,2015 as year,2015+5 as baseyear 
union all 
select id,year+1,baseyear from cte c 
where c.year<baseyear 
) 
select * from cte 

あなたのコードは、この

WITH YEARLIST 
AS (
SELECT PROJECT_NUMBER 
     ,START_YEAR AS YEAR 
     ,START_YEAR+5 as BaseYear 
    FROM TABLE_ABC 

    UNION ALL 
    SELECT 
      PROJECT_NUMBER 
      ,Y.YEAR +1 AS YEAR, 
      BaseYear 
      FROM YEARLIST Y 
      WHERE Y.YEAR < Y.BaseYear 
    ) 
    SELECT 
     PROJECT_NUMBER 
     ,YEAR 
    FROM YEARLIST 
0

このように書きますonce..so Y.YEAR >= Y.YEAR +5のみを実行します。この状態は、あなたが望むものの一種であります数値または集計表を使用する。これはt-sqlのスイス軍ナイフです。私はこのような見方で私を守っています。

create View [dbo].[cteTally] as 

WITH 
    E1(N) AS (select 1 from (values (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))dt(n)), 
    E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows 
    E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E+4 or 10,000 rows max 
    cteTally(N) AS 
    (
     SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4 
    ) 
select N from cteTally 

次に、テストテーブルとサンプルデータを設定する必要があります。

create table #Projects 
(
    ProjectNumber int 
    , StartYear int 
) 

insert #Projects (ProjectNumber, StartYear) 
values (1, 2015),(2, 2018) 

これまで、すべてのことが確立されたので、タリー表を使用して目的の出力を取得する簡単なクエリです。

select ProjectNumber 
    , OutputYear = datepart(year, DATEADD(year, x.N - 1, convert(char(4), StartYear) + '-01-01')) 
from #Projects p 
cross apply 
(
    select N 
    from cteTally t 
    where t.N <= 5 
) x 
order by p.ProjectNumber 
    , OutputYear 

我々はそれをカウントするための再帰CTEを使用するときには本当に舞台裏ループとよくない習慣ですので、私は、この集計テーブルCTEの代わりに、あなたの再帰的なものを使用。 http://www.sqlservercentral.com/articles/T-SQL/74118/

+0

ありがとう@Sean Lange ..私はこれを試してみて、それは私に完璧な結果をもたらします...しかし、パクレリーのロジックはシンプルです。ご回答有難うございます。私は将来この論理を使用します... –

関連する問題