3

こんにちは、SQL Server 2008 は初めてです

単一の行を別の列に基づいて複数の行に展開したい、

例えば

date          value
7-2011         5

結果:

2011-07-01     
2011-08-01
2011-09-01
2011-10-01
2012-11-01

日付は、現在の月と翌月の最初の日である必要があり、5 回繰り返されます

4

2 に答える 2

7

試す:

DECLARE @YourTable table (YourDate datetime, value int)

insert into @YourTable VALUES ('2011-7-12',5)

;WITH AllNumbers AS
(
    SELECT 0 AS Number
    UNION ALL
    SELECT Number+1
        FROM AllNumbers
        WHERE Number<4
)
SELECT 
    dateadd(month,number,DATEADD(month,DATEDIFF(month,0,YourDate),0))
    FROM @YourTable        y
    INNER JOIN AllNumbers  a ON 1=1

出力:

-----------------------
2011-07-01 00:00:00.000
2011-08-01 00:00:00.000
2011-09-01 00:00:00.000
2011-10-01 00:00:00.000
2011-11-01 00:00:00.000

(5 row(s) affected)

テーブル内の複数の行で機能します。こちらを参照してください。

DECLARE @YourTable table (YourDate datetime, ValueOf int)

insert into @YourTable VALUES ('2011-7-12',5)
insert into @YourTable VALUES ('2012-4-24',6)

;WITH AllNumbers AS
(
    SELECT 0 AS Number
    UNION ALL
    SELECT Number+1
        FROM AllNumbers
        WHERE Number<4
)
SELECT 
    y.ValueOf
        ,dateadd(month,number,DATEADD(month,DATEDIFF(month,0,y.YourDate),0))
    FROM @YourTable        y
    INNER JOIN AllNumbers  a ON 1=1
    ORDER BY 1,2

出力:

ValueOf     
----------- -----------------------
5           2011-07-01 00:00:00.000
5           2011-08-01 00:00:00.000
5           2011-09-01 00:00:00.000
5           2011-10-01 00:00:00.000
5           2011-11-01 00:00:00.000
6           2012-04-01 00:00:00.000
6           2012-05-01 00:00:00.000
6           2012-06-01 00:00:00.000
6           2012-07-01 00:00:00.000
6           2012-08-01 00:00:00.000

(10 row(s) affected)

また、私は SQL Server 2008 を利用できDATEないので、datetime を使用しました。

dateadd(month,number,y.YourDate)
于 2012-04-24T13:17:52.980 に答える
2
create  function addMonths(@date date, @limit int)
returns @date_table TABLE(
myDate date
)
AS
begin
  declare @cont int
  set @cont = 1
  while (@cont <= @limit) begin
    insert into @date_table values(DATEADD(MONTH,@cont,@date))
    set @cont=@cont+1
  end

  return 
end

利用方法:

select * from addMonths(GETDATE(),5)

編集:

create table mydates(
myDate date,
inc_months int)


insert into mydates values ('01/01/2005',3)
insert into mydates values ('01/01/2006',5)


select AM.mydate 
from mydates MD cross apply addMonths(MD.mydate,MD.inc_months) AM

結果:

2005-02-01
2005-03-01
2005-04-01
2006-02-01
2006-03-01
2006-04-01
2006-05-01
2006-06-01
于 2012-04-24T13:25:00.590 に答える