我有一条记录,我希望根据月份进行拆分。 当我进行拆分时,我试图按原样复制所有数据,但只想逐步更改FromMonth字段。
对于前,
Record to be split:
c1 c2 c3 c4 FromMonth ToMonth Y
---------------------------------------
AA BB CC DD Feb Dec 2013
Resultant Records:
1.)
c1 c2 c3 c4 FromMonth ToMonth Y
---------------------------------------
AA BB CC DD Mar Dec 2013
2.)
c1 c2 c3 c4 FromMonth ToMonth Y
---------------------------------------
AA BB CC DD Apr Dec 2013
3.)
c1 c2 c3 c4 FromMonth ToMonth Y
---------------------------------------
AA BB CC DD May Dec 2013
.
.
.
.
任何建议或方法都会有用。
这就是我所做的,我是新的,我只是在学习:
DECLARE @FromMonth Int;
DECLARE @ToMonth Int;
DECLARE @Result int;
DECLARE @C1 int;
DECLARE @C2 int;
DECLARE @C3 int;
DECLARE @C4 decimal(20,8);
DECLARE @C5 uniqueidentifier;
DECLARE @C6 varchar(1000);
DECLARE @C7 int;
DECLARE @C8 int;
DECLARE @C9 int;
DECLARE @C10 bit;
DECLARE @C11 date;
DECLARE @C12 date;
set @FromMonth = (select FromMonth from master..t where t.c1=1 );
set @ToMonth = (select ToMonth from master.t where t.c1=1 );
set @Result=@ToMonth - @FromMonth;
while(@Result!=0)
begin
set @FromMonth = @FromMonth+1
insert into master..t(c1,c2,c3,c4,c5,c6,c7,c8,c9,c10,c11,c12,FromMonth,ToMonth)
values(c1,c2,c3,c4,c5,c6,c7,c8,c9,c10,c11,c12,@FromMonth,ToMonth);
set @Result = @Result -1;
break;
end;
谢谢,
答案 0 :(得分:1)
我想你需要从'FM'到'TM'月生成行,试试这个:
DECLARE @t TABLE (c1 VARCHAR(10),c2 VARCHAR(10),c3 VARCHAR(10),c4 VARCHAR(10),FM VARCHAR(10),TM VARCHAR(10),Y VARCHAR(10))
INSERT @t VALUES
('AA', 'BB', 'CC', 'DD', '02', '12', '13')
SELECT a.c1
, a.c2
, a.c3
, a.c4
, number FM
, a.TM
, a.Y
FROM @t a
JOIN master..spt_values b ON
type = 'P'
AND number > CAST(a.FM AS INT) AND number <= CAST(a.TM AS INT)
此示例根据单行中的数据生成新行。它会复制除FM
字段之外的所有字段,此字段的值为spt_values.number
。表master..spt_values
用于生成新行。
例如:
SELECT number
FROM master..spt_values b
WHERE type = 'P'
将生成0到2047之间的序号。编写该表的连接,以便生成TM
- FM
行数,范围从3到12。
<强>更新强>
可以将SELECT
语句的结果插入到表中,条件是表中的字段数和类型以及结果是相同的。 INSERT
语句可以从已执行的SELECT
语句中插入值:
INSERT @t
SELECT a.c1
, a.c2
, a.c3
, a.c4
, number FM
, a.TM
, a.Y
FROM @t a
JOIN master..spt_values b ON
type = 'P'
AND number > CAST(a.FM AS INT) AND number <= CAST(a.TM AS INT)