【问题标题】:MS SQL - Sequential read and writeMS SQL - 顺序读写
【发布时间】:2016-09-16 03:09:23
【问题描述】:

我已将我需要的数据过滤到一个表格中,但我意识到它位于 3 个不同的行上。

我需要帮助在 MS SQL 中编码逻辑来完成以下工作。基本上,我需要的数据位于 3 个不同的行上。 “W”行中的所有数据都需要,而接下来的 2 行中只需要 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

【问题讨论】:

  • 首先也是最重要的......您需要逐行逻辑并使用基于集合的逻辑。将 B 视为您的选择语句而不是写入。您需要的是表 A 上的自联接。
  • 是的,这确实有道理。我会试试的!谢谢
  • 对“接下来的两行”使用窗口函数 over ... order by(date)

标签: sql-server sequential


【解决方案1】:

这是不好的方法,但这是你想要的:

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

【讨论】:

    猜你喜欢
    • 2021-09-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-08
    • 1970-01-01
    相关资源
    最近更新 更多