1. 程式人生 > >sqlserver 練習題目(儲存過程:迴圈erp資料表,生成另一個表資料)

sqlserver 練習題目(儲存過程:迴圈erp資料表,生成另一個表資料)

需求

– ##表結構 ###
use test_db;

CREATE TABLE [dbo].[GYGDFT](
[任務單號] varchar NOT NULL,
[任務序號] [int] NULL,
[品號] varchar NULL,
[生產數量] [int] NULL,
[備註] varchar NULL
) ON [PRIMARY]

GO

CREATE TABLE [dbo].[GYJHD](
[計劃單號] varchar NOT NULL,
[計劃序號] [int] NULL,
[品號] varchar NULL,
[計劃出貨數量] [int] NULL,
[計劃日期] [date] NULL
) ON [PRIMARY]

drop table [TEST_REPORT];
CREATE TABLE [dbo].[TEST_REPORT](
[任務單號] varchar NULL,
[任務序號] [int] NULL,
[品號] varchar NULL,
[生產數量] [int] NULL,
[計劃出貨數量] [int] NULL,
[分配數量] [int] NULL,
[生產剩餘數量] [int] NULL,
[計劃單號] varchar NULL,
[計劃序號] [int] NULL,
[計劃日期] [date] NULL
) ON [PRIMARY]

GO

– =========學習階段:查詢任務單號 並分頁 開始================
select * from
(
select row_number()over(order by 任務序號 )temprownumber,*
from (select top 2 tempcolumn=0,*
from GYGDFT
)t
)tt where temprownumber>1

select top 1 *
from
(
select ROW_NUMBER() over (order by 任務序號) as rownumber, * from GYGDFT
) a
where a.rownumber>=2

–10代表分頁的大小
select top 2 *
from GYGDFT
where 任務序號 not in
(
–40是這麼計算出來的:10*(5-1)
select top 1 任務序號 from GYGDFT order by 任務序號
)
order by 任務序號
– =學習階段:查詢任務單號 並分頁 結束=

– ## 開始愉快的旅程 開始 ##
go
create procedure sp_test_report
as
begin
declare @rwdh varchar(50),
@rwxh int,
@ph varchar(50),
@scsl int,
@jhchsl int,
@fpsl int,
@jhdh varchar(50),
@jhxh int,
@scsysl int,
@jhrq date;

declare @qscsl int, --前一個生產數量
@qjhchsl int, --前一個計劃出貨數量
@qfpsl int,--前一個分配數量
@qscsysl int,   --前一個生產剩餘數量
@qrwxh int; --前一個任務序號

set @qscsl=0;
set @qjhchsl=0;
set @qfpsl=0;
set @qscsysl=0;
set @qrwxh=-1;


declare @rw_i int;  
set @rw_i=0; -- 任務迴圈變數
declare @rw_count int;  --任務總記錄數
select @rw_count=COUNT(任務單號)  from GYGDFT;

declare @jh_i int;  
set @jh_i=0; -- 計劃迴圈變數
declare @jh_count int;  --任務總記錄數
select @jh_count=COUNT(計劃單號)  from GYJHD;

declare @only_task int; 
set @only_task=0; --只有任務沒有計劃

while (@rw_i<@rw_count)
begin
    select top 1 @rwdh=任務單號, @rwxh=任務序號, @ph=品號, @scsl=生產數量  
    from GYGDFT
    where 任務序號 not in (
        select top (@rw_i) 任務序號 from GYGDFT order by 任務序號
    ) 
    order by 任務序號;

    while(@jh_i<@jh_count) 
        begin -- 計劃表迴圈開始
            select top 1 @jhchsl=計劃出貨數量,@jhdh=計劃單號, @jhxh=計劃序號, @jhrq=計劃日期  
            from GYJHD
            where 計劃序號 not in 
                (
                select top (@jh_i) 計劃序號 from GYJHD order by 計劃序號
                ) 
            order by 計劃序號;

            --分配數量
            set @fpsl = CASE 
                 WHEN @qscsysl=0 and @qrwxh = -1 THEN @jhchsl   
                 WHEN @qscsysl > 0 and @jhchsl > abs(@qscsysl) THEN @qscsysl    
                 WHEN @qscsysl > 0 and @jhchsl < abs(@qscsysl)  THEN @jhchsl                    
            ELSE [email protected] END;

            if(@rw_i=0) 
            begin
                set @qrwxh = @rwxh;                 
            end                         

            if(@qrwxh = @rwxh) 
                -- 同一個任務序號
                begin
                    select @qrwxh,@rwxh,1;
                    set @scsysl = case
                        -- 前生產剩餘數量 
                        when @qscsysl > 0 then @[email protected]                  
                    else @[email protected] end;
                    select @scsysl as '生產剩餘數量1';
                end     
            else
                begin -- 任務序號不同
                    select @qrwxh,@rwxh,2;
                    set @scsysl = CASE                           
                         WHEN @qscsysl < 0 THEN @[email protected] 
                    else @[email protected] end;                         

                    select @scsysl as '生產剩餘數量2';            
                end     

            select @rwdh,@rwxh,@ph,@scsl,@jhchsl,@fpsl,@scsysl,@jhdh,@jhxh,@jhrq;

            insert into TEST_REPORT(任務單號,任務序號,品號,生產數量,計劃出貨數量,分配數量,生產剩餘數量,計劃單號,計劃序號,計劃日期) 
            values(@rwdh,@rwxh,@ph,@scsl,@jhchsl,@fpsl,@scsysl,@jhdh,@jhxh,@jhrq);

            -- 生產數量 計劃出貨數量  分配數量    生產剩餘數量賦值給前一個變數
            set @[email protected];
            set @[email protected];
            set @[email protected];
            set @[email protected];

            if(@qscsysl>0)
                begin
                    set @[email protected];
                    set @[email protected]_i+1;
                end
            else
            begin
                break; -- 任務已經完成,進行下一個任務
            end

        end; -- 計劃表迴圈結束


        set @[email protected]_i+1;  


        if(@only_task=1) 
        begin
            set @[email protected] + @qscsysl;
            insert into TEST_REPORT(任務單號,任務序號,品號,生產數量,計劃出貨數量,分配數量,生產剩餘數量,計劃單號,計劃序號,計劃日期) 
            values(@rwdh,@rwxh,@ph,@scsl,0,0,@qscsysl,null,null,null);
        end

        if(@[email protected]_count) 
        begin
            set @only_task=1;
        end


end

end
– ## 結束 愉快的旅程 ##

– 執行儲存過程,並查詢
exec dbo.sp_test_report;
select * from TEST_REPORT;

– 刪除儲存過程,並刪除資料
drop procedure sp_test_report;
truncate table test_report;

測試資料
GYJHD(計劃表)
計劃單號 計劃序號 品號 計劃出貨數量 計劃日期
2016092701 1 BM280B-1.0301 400 20160927
2016092701 2 BM280B-1.0301 600 20160928
2016092701 3 BM280B-1.0301 300 20160929
2016092701 4 BM280B-1.0301 700 20160930

GYGDFT(生產任務表)
任務單號 任務序號 品號 生產數量 備註
20160720001 1 BM280B-1.0301 900
20160720002 2 BM280B-1.0301 700
20160720003 3 BM280B-1.0301 900
20160720004 4 BM280B-1.0301 100
20160720005 5 BM280B-1.0301 300
SQL語句得出
任務單號 任務序號 品號 生產數量 計劃出貨數量 分配數量 生產剩餘數量 計劃單號 計劃序號 計劃日期
20160720001 1 BM280B-1.0301 900 400 400 500 2016092701 1 20160927
20160720001 1 BM280B-1.0301 900 600 500 -100 2016092701 2 20160928
20160720002 2 BM280B-1.0301 700 600 100 600 2016092701 2 20160928
20160720002 2 BM280B-1.0301 700 300 300 300 2016092701 3 20160929
20160720002 2 BM280B-1.0301 700 700 300 -400 2016092701 4 20160930
20160720003 3 BM280B-1.0301 900 700 400 500 2016092701 4 20160930
20160720004 4 BM280B-1.0301 100 0 0 600
20160720005 5 BM280B-1.0301 300 0 0 900
下載地址:
http://download.csdn.net/detail/u010503822/9644796