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