2016-09-14 70 views
0

我已经将需要的数据过滤到表中,但意识到它在3个不同的行上。MS SQL - 顺序读取和写入

我需要帮助MS SQL中的编码逻辑完成以下任务。基本上,我需要的数据在3个不同的行上。所有的数据都是从“W”行开始的,只有在下两行的DESC列中的数据才会有相同的日期和时间。

  1. 读表A依次
  2. 如果列AC包含 “W” 保存数据。
  3. 读取下一行,将数据保存在DESC列中。
  4. 阅读下一行,将数据保存在DESC
  5. 将数据写入表B.
  6. 读,直到下一列AC包含“W,重复2-5
  7. 结束

表A

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

使用窗口函数'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