2016-09-14 12 views
0

私は必要なデータをテーブルにフィルタリングしましたが、3つの異なる行にあることに気付きました。MS SQL - シーケンシャルな読み取りと書き込み

私は、以下を達成するためにMS SQLでロジックをコーディングするのに役立つ必要があります。基本的に、必要なデータは3つの異なる行にあります。すべてのデータは「W」行から必要とされ、次の2行からDESC列内のデータだけが同じ日時になります。

  1. 読む表順次列ACは、データを保存する "W" が含まれている場合
  2. 次の行を読み、データをDESC列に保存します。
  3. 読む次の行には、「W、2-5
  4. エンド

表Aを繰り返し

  • ACが含まれる次の列まで表B.
  • 読むにデータを書き込むDESCにデータを保存します

    DATE TIME ACCT ATM AC AMT LOCATION 
    7/11/16 1040 5555  C 0 DUNKIN #3   
    7/11/16 1105 5555 #1 W -20             
    7/11/16 1105 5555  C 0 ATM     
    7/11/16 1105 5555  C 0 DUNKIN #3 
    7/12/16 2141 5555  C 0 BP#9 
    7/19/16 1025 5555 #2 W -40            
    7/19/16 1025 5555  C 0 ATM     
    7/19/16 1025 5555  C 0 SBUCKS #1 
    7/21/16 2102 5555  C 0 BP#5 
    

    表B

    DATE TIME ACCT ATM AC AMT TRAN LOCATION 
    7/11/16 1105 5555 #1 W -20 ATM DUNKIN #3 
    7/19/16 1025 5555 #2 W -40 ATM STARBUCKS #1 
    
  • +2

    まず、最も重要な..あなたは、行のロジックと使用セットベースのロジックにより、行の外に取得する必要があります。 Bはあなたの選択したステートメントではなく、書くと考えてください。あなたが必要とするのはテーブルAの自己参加です。 – xenapan

    +0

    そうですね、それは意味があります。私はそれを試してみよう!ありがとう – Sky

    +0

    あなたの "次の2つの行"にはウィンドウ関数 "over ... order by(date)"を使います。 – ajeh

    答えて

    0

    それは悪いアプローチだが、それはあなたが何をしたいです:

    declare @a table(mDate Date, MTime int, ACCCT int, Atm nVarChar(2), AC nVarChar(1), AMT int, Location nVarChar(50)) 
    insert into @a(mDate, MTime, ACCCT, Atm, AC, AMT, Location) 
    select N'7/11/16', 1040, 5555, '', 'C', 0, 'DUNKIN #3'   
    union all 
    select N'7/11/16', 1105, 5555, '#1', 'W', -20, ''   
    union all 
    select N'7/11/16', 1105, 5555, '', 'С', 0, 'ATM'   
    union all 
    select N'7/11/16', 1105, 5555, '', 'С', 0, 'DUNKIN #3'   
    union all 
    select N'7/12/16', 2141, 5555, '', 'С', 0, 'BP#9'   
    union all 
    select N'7/19/16', 1025, 5555, '#2', 'W', -40, ''   
    union all 
    select N'7/19/16', 1025, 5555, '', 'C', 0, 'ATM'   
    union all 
    select N'7/19/16', 1025, 5555, '', 'C', 0, 'SBUCKS #1'   
    union all 
    select N'7/21/16', 2102, 5555, '', 'C', 0, ''   
    
    declare @b table(mDate Date, MTime int, ACCCT int, Atm nVarChar(2), AC nVarChar(1), AMT int, mTran nVarChar(50), Location nVarChar(50)) 
    
    
    declare @mDate Date, @MTime int, @ACCCT int, @Atm nVarChar(2), @AC nVarChar(1), @AMT int, @Location nVarChar(50) 
    
    declare @mDate2 Date, @MTime2 int, @ACCCT2 int, @Atm2 nVarChar(2), @AC2 nVarChar(1), @AMT2 int, @mTran2 nVarChar(50), @Location2 nVarChar(50) 
    
    declare @Fl int set @Fl = 0 
    
    DECLARE @Cur as CURSOR; 
    
    set @Cur = CURSOR FORWARD_ONLY FOR 
    select mDate, MTime, ACCCT, Atm, AC, AMT, Location 
    from @a 
    order by mDate, MTime, AMT; 
    
    OPEN @Cur 
    
    FETCH NEXT FROM @Cur INTO @mDate, @MTime, @ACCCT, @Atm, @AC, @AMT, @Location 
    WHILE @@FETCH_STATUS = 0 
    BEGIN 
    if @Fl = 2 set @mTran2 = @Location 
    if @Fl = 1 
    begin 
        set @Location2 = @Location 
        insert into @b (mDate, MTime, ACCCT, Atm, AC, AMT, mTran, Location) 
        select @mDate2, @MTime2, @ACCCT2, @Atm2, @AC2, @AMT2, @mTran2, @Location2 
    end 
    
    if @Fl = 2 
        set @Fl = 1 
    else if @Fl = 1 set @Fl = 0 
    
    if @AC = 'W' 
    begin 
        set @Fl = 2 
        set @mDate2 = @mDate 
        set @MTime2 = @MTime 
        set @ACCCT2 = @ACCCT 
        set @Atm2 = @Atm 
        set @AC2 = @AC 
        set @AMT2 = @AMT 
    end 
    
    FETCH NEXT FROM @Cur INTO @mDate, @MTime, @ACCCT, @Atm, @AC, @AMT, @Location 
    
    END 
    
    CLOSE @Cur; 
    DEALLOCATE @Cur; 
    
    select * from @b 
    
    関連する問題