-3

月に基づいて分割したいレコードが 1 つあります。分割を行っているとき、すべてのデータをそのままコピーしようとしていますが、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;

ありがとう、

4

1 に答える 1

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)

この例では、1 つの行で見つかったデータから新しい行を生成します。フィールドを除くすべてのフィールドをコピーします。FMこのフィールドは の値を取りますspt_values.number。テーブルmaster..spt_valuesは、新しい行を生成するために使用されます。

例えば:

SELECT  number
FROM    master..spt_values b
WHERE   type = 'P'

0 から 2047 までの序数を生成します。そのテーブルの結合は、3 から 12 までの行数をTM生成するように記述されています。FM

アップデート

ステートメントの結果を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)
于 2013-02-12T08:42:28.190 に答える