Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 SQL如何从一行创建多行_Sql Server 2008 - Fatal编程技术网

Sql server 2008 SQL如何从一行创建多行

Sql server 2008 SQL如何从一行创建多行,sql-server-2008,Sql Server 2008,您好,我是SQL server 2008的新手 我想基于另一列将单行扩展为多行 e、 g 结果: 2011-07-01 2011-08-01 2011-09-01 2011-10-01 2012-11-01 日期应为当前和下个月的第一天,重复5次 DECLARE @YourTable table (YourDate datetime, value int) insert into @YourTable VALUES ('2011-7-12',5) ;WITH AllNumbers

您好,我是SQL server 2008的新手

我想基于另一列将单行扩展为多行

e、 g

结果:

2011-07-01     
2011-08-01
2011-09-01
2011-10-01
2012-11-01
日期应为当前和下个月的第一天,重复5次

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
它适用于表中的多行,请参见此处:

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
另外,我没有可用的SQL Server 2008,所以我使用了datetime,如果您有2008,您可以使用
DATE
datatype,并且您不必设置日期时间,所以使用这一行:

dateadd(month,number,y.YourDate)
编辑:

结果:

2005-02-01
2005-03-01
2005-04-01
2006-02-01
2006-03-01
2006-04-01
2006-05-01
2006-06-01

您传入@date,但在函数中使用GETDATE(),但问题是我不想传递@date和值,我必须从其他表中选择它们,并在新表中进行扩展,例如,我有1000行和值,这是否意味着我必须传递参数1000?而不是从现有的表格中选择它们?@Diego谢谢你是个明星!!如何将该功能添加到我的常规查询中?我从来没有和他们合作过好吧,取决于你的质疑。如果您遵循我的示例,只需将表的mydates表以及mydate和inc_months列替换为您的列即可。我已经这样做了,谢谢,还有一个问题,虽然我有一个这样格式的日期:5-2011当我使用addMonth函数运行查询时,我得到了这个错误:从字符串转换日期和/或时间时转换失败。如何将其转换为日期?谢谢,但是我有一个具有不同月份和值的表,我想按值拆分,而不是单个值。谢谢,它可以工作,但我如何从表中动态选择日期和值,而不是手动设置它们?我不确定您要的是什么?您始终可以添加一个
,其中ValueOf=6
或类似的内容。
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)
dateadd(month,number,y.YourDate)
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