根据型号年末月份拆分多个记录

时间:2013-02-12 08:29:37

标签: sql-server-2008

我有一条记录,我希望根据月份进行拆分。 当我进行拆分时,我试图按原样复制所有数据,但只想逐步更改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;

谢谢,

1 个答案:

答案 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)