2017-06-26 19 views
0

にコンマCTEで区切られた、私のフィールドの値が、私はEndYearと呼ばれる別のフィールドを持って2000年で、私のフィールドの値は、2005年年、私はStartYearというフィールドを持つSQL Serverの

である私が作成したいです2005,2004,2003,2002,2001,2000の値を持つYearsInTheProgramという名前のフィールド。

私の行はそれぞれ異なる値を持っていますので、本来はこのフィールドに自分のフィールドの違いをカンマで区切ってください。

私はうまくいくものを見つけることができましたが、これは私に別の行の価値を与えるでしょう。しかし、私はそれらをすべて一列にしたい。

with CTE as 
     (
     select datepart(year, '2006-12-25') as yr 
     union all 
     select yr + 1 
     from CTE 
     where yr < datepart(year, '2013-11-14') 
     ) 
select yr 
from CTE 
+0

で一つは、カラム内の区切られたリストを保存することはほとんどないはずです、なぜ開始/終了年は自分自身では十分ではありませんか? –

+0

私の結果を得るには後でフィルターを使う必要があるからです。私は別のプロセスを作成するために、その間に結果が必要です。 –

+0

したがって、列にピボットさせたい行を照会してから列ストリングをフィルターに掛けるのですか?しかし、単に行をフィルタリングするだけではないのですか? –

答えて

0
declare @tmp varchar(250) 
SET @tmp = '' 

;with CTE as 
     (
     select datepart(year, '2006-12-25') as yr 
     union all 
     select yr + 1 
     from CTE 
     where yr < datepart(year, '2013-11-14') 
     ) 

select @tmp = @tmp + convert(varchar(500), yr) + ', ' from CTE 
select SUBSTRING(@tmp, 0, LEN(@tmp)) as yr 
0

あなたはこのCTEを使用した年のあなたの文字列をbulidすることができます。

DECLARE @STARTYEAR varchar(10) = '2006-12-25' 
DECLARE @ENDYEAR varchar(10) = '2013-11-14' 

;with CTE as 
     (
     select datepart(year, @STARTYEAR) as yr, CAST(datepart(year, @STARTYEAR) AS VARCHAR(MAX)) as c 
     union all 
     select yr + 1 as yr, CAST(concat(c, ',', yr+1) AS VARCHAR(MAX)) as c 
     from CTE 
     where yr < datepart(year, @ENDYEAR) 
     ) 
select yr, c 
from CTE 
where (yr = datepart(year, @ENDYEAR)) 

ここでは、StartYearとEndYearがDBテーブルから取得されます。

create table #yr (id int, start varchar(20), stop varchar(20)) 
insert into #yr values(1,'2005-01-01','2010-12-10'), (2,'2008-01-01','2011-12-10'), (3,'2007-01-01','2013-12-10'), (4,'2009-01-01','2012-10-10') 

;with CTE as 
     (
     select start as start, datepart(year, start) as yr, CAST(datepart(year, start) AS VARCHAR(MAX)) as c from #yr 
     union all 
     select CTE.start as start, yr + 1 as yr, CAST(concat(c, ',', yr+1) AS VARCHAR(MAX)) as c 
     from CTE join #yr on #yr.start = CTE.start 
     where yr < datepart(year, stop) 
     ) 
select id, #yr.start, #yr.stop, c 
from CTE join #yr on #yr.start = CTE.start 
where (yr = datepart(year, stop)) 

次の結果

4 2009-01-01 2012-10-10 2009,2010,2011,2012 
3 2007-01-01 2013-12-10 2007,2008,2009,2010,2011,2012,2013 
2 2008-01-01 2011-12-10 2008,2009,2010,2011 
1 2005-01-01 2010-12-10 2005,2006,2007,2008,2009,2010 
関連する問題