Sql server 2008 SQL如何从一行创建多行
您好,我是SQL server 2008的新手 我想基于另一列将单行扩展为多行 e、 g 结果: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
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