-------- 订单表 ----
CREATE TABLE #tOrder
(
RefNum VARCHAR(20), --订单编号
SKU VARCHAR(20), --SKU 编号
NUM INT --SKU 数量
)INSERT INTO #tOrder SELECT 'Ref001','EAY102(black)',20
INSERT INTO #tOrder SELECT 'Ref001','EAY102(blue)',10
INSERT INTO #tOrder SELECT 'Ref002','EAY102(black)',20
INSERT INTO #tOrder SELECT 'Ref003','EAY102(blue)',40
INSERT INTO #tOrder SELECT 'Ref004','EAY102(green)',40
----- SKU 流水号信息 ----
CREATE TABLE #tmp
(
ImportID INT, ----关联#FlowInfo 表 ImportID
SKU VARCHAR(20), ----SKU 编号
FlowNo_From VARCHAR(10),----流水号起始
FLowNo_To VARCHAR(10), ----流水号截止
Location VARCHAR(10) ----货架号
)INSERT INTO #tmp SELECT 13,'EAY102(black)','0061','0100','D127'
INSERT INTO #tmp SELECT 13,'EAY102(black)','0031','0060','D126'
INSERT INTO #tmp SELECT 13,'EAY102(black)','0001','0030','D125'
INSERT INTO #tmp SELECT 14,'EAY102(blue)','0001','0100','D124'
INSERT INTO #tmp SELECT 15,'EAY102(green)','0051','0090','D123'
INSERT INTO #tmp SELECT 15,'EAY102(green)','0001','0050','D122'------- 流水号记录表 ---
CREATE TABLE #FlowInfo
(
ImportID INT, --- ID
FlowNo VARCHAR(10), --- 流水号
Ttype INT --- 0 坏品, 1 已出库
)INSERT INTO #FlowInfo SELECT 13,'0098',0
INSERT INTO #FlowInfo SELECT 15,'0010',0
INSERT INTO #FlowInfo SELECT 15,'0012',0
SELECT * FROM #tOrder
SELECT * FROM #tmp
SELECT * FROM #FlowInfo--------------- 最终效果(执行查看), --------------
SELECT 'Ref001' AS RefNum,'EAY102(black)' AS SKU,'0099-0100' AS FlowNo,2 AS Num,'D127' AS Location
UNION ALL
SELECT 'Ref001','EAY102(black)','0080-0097',18,'D127'
UNION ALL
SELECT 'Ref001','EAY102(blue)','0091-0100',10,'D124'
UNION ALL
SELECT 'Ref002','EAY102(black)','0061-0079',19,'D127'
UNION ALL
SELECT 'Ref002','EAY102(black)','0060-0060',1,'D126'
UNION ALL
SELECT 'Ref003','EAY102(blue)','0051-0090',40,'D124'
UNION ALL
SELECT 'Ref004','EAY102(green)','0051-0090',40,'D123'------ 下面说下,这结果是怎么来的
------ 按每个订单,记录所出的SKU所对应的流水号以及货架号(Location) ,流水号从大往小获取
------ 如果流水号范围内有坏品 (#tmp 表ImportID 关联 #FlowInfo 表,Ttype=0),则不记录坏评的流水号
------ 比如 #FlowInfo 表中ImportID=13 有个 流水号:0098 是坏品,所以最后结果 0099-0100 , 0080-0097 显示
-------RefNum SKU FlowNo Num Location
-------Ref001 EAY102(black) 0099-0100 2 D127
-------Ref001 EAY102(black) 0080-0097 18 D127drop table #tmp
drop table #FlowInfo
drop table #tOrder
CREATE TABLE #tOrder
(
RefNum VARCHAR(20), --订单编号
SKU VARCHAR(20), --SKU 编号
NUM INT --SKU 数量
)INSERT INTO #tOrder SELECT 'Ref001','EAY102(black)',20
INSERT INTO #tOrder SELECT 'Ref001','EAY102(blue)',10
INSERT INTO #tOrder SELECT 'Ref002','EAY102(black)',20
INSERT INTO #tOrder SELECT 'Ref003','EAY102(blue)',40
INSERT INTO #tOrder SELECT 'Ref004','EAY102(green)',40
----- SKU 流水号信息 ----
CREATE TABLE #tmp
(
ImportID INT, ----关联#FlowInfo 表 ImportID
SKU VARCHAR(20), ----SKU 编号
FlowNo_From VARCHAR(10),----流水号起始
FLowNo_To VARCHAR(10), ----流水号截止
Location VARCHAR(10) ----货架号
)INSERT INTO #tmp SELECT 13,'EAY102(black)','0061','0100','D127'
INSERT INTO #tmp SELECT 13,'EAY102(black)','0031','0060','D126'
INSERT INTO #tmp SELECT 13,'EAY102(black)','0001','0030','D125'
INSERT INTO #tmp SELECT 14,'EAY102(blue)','0001','0100','D124'
INSERT INTO #tmp SELECT 15,'EAY102(green)','0051','0090','D123'
INSERT INTO #tmp SELECT 15,'EAY102(green)','0001','0050','D122'------- 流水号记录表 ---
CREATE TABLE #FlowInfo
(
ImportID INT, --- ID
FlowNo VARCHAR(10), --- 流水号
Ttype INT --- 0 坏品, 1 已出库
)INSERT INTO #FlowInfo SELECT 13,'0098',0
INSERT INTO #FlowInfo SELECT 15,'0010',0
INSERT INTO #FlowInfo SELECT 15,'0012',0
SELECT * FROM #tOrder
SELECT * FROM #tmp
SELECT * FROM #FlowInfo--------------- 最终效果(执行查看), --------------
SELECT 'Ref001' AS RefNum,'EAY102(black)' AS SKU,'0099-0100' AS FlowNo,2 AS Num,'D127' AS Location
UNION ALL
SELECT 'Ref001','EAY102(black)','0080-0097',18,'D127'
UNION ALL
SELECT 'Ref001','EAY102(blue)','0091-0100',10,'D124'
UNION ALL
SELECT 'Ref002','EAY102(black)','0061-0079',19,'D127'
UNION ALL
SELECT 'Ref002','EAY102(black)','0060-0060',1,'D126'
UNION ALL
SELECT 'Ref003','EAY102(blue)','0051-0090',40,'D124'
UNION ALL
SELECT 'Ref004','EAY102(green)','0051-0090',40,'D123'------ 下面说下,这结果是怎么来的
------ 按每个订单,记录所出的SKU所对应的流水号以及货架号(Location) ,流水号从大往小获取
------ 如果流水号范围内有坏品 (#tmp 表ImportID 关联 #FlowInfo 表,Ttype=0),则不记录坏评的流水号
------ 比如 #FlowInfo 表中ImportID=13 有个 流水号:0098 是坏品,所以最后结果 0099-0100 , 0080-0097 显示
-------RefNum SKU FlowNo Num Location
-------Ref001 EAY102(black) 0099-0100 2 D127
-------Ref001 EAY102(black) 0080-0097 18 D127drop table #tmp
drop table #FlowInfo
drop table #tOrder
-------- 订单表 ----
CREATE TABLE #tOrder
(
RefNum VARCHAR(20), --订单编号
SKU VARCHAR(20), --SKU 编号
NUM INT --SKU 数量
)INSERT INTO #tOrder SELECT 'Ref001','EAY102(black)',20
INSERT INTO #tOrder SELECT 'Ref001','EAY102(blue)',10
INSERT INTO #tOrder SELECT 'Ref002','EAY102(black)',20
INSERT INTO #tOrder SELECT 'Ref003','EAY102(blue)',40
INSERT INTO #tOrder SELECT 'Ref004','EAY102(green)',40
----- SKU 流水号信息 ----
CREATE TABLE #tmp
(
ImportID INT, ----关联#FlowInfo 表 ImportID
SKU VARCHAR(20), ----SKU 编号
FlowNo_From VARCHAR(10),----流水号起始
FLowNo_To VARCHAR(10), ----流水号截止
Location VARCHAR(10) ----货架号
)INSERT INTO #tmp SELECT 13,'EAY102(black)','0061','0100','D127'
INSERT INTO #tmp SELECT 13,'EAY102(black)','0031','0060','D126'
INSERT INTO #tmp SELECT 13,'EAY102(black)','0001','0030','D125'
INSERT INTO #tmp SELECT 14,'EAY102(blue)','0001','0100','D124'
INSERT INTO #tmp SELECT 15,'EAY102(green)','0051','0090','D123'
INSERT INTO #tmp SELECT 15,'EAY102(green)','0001','0050','D122'------- 流水号记录表 ---
CREATE TABLE #FlowInfo
(
ImportID INT, --- ID
FlowNo VARCHAR(10), --- 流水号
Ttype INT --- 0 坏品, 1 已出库
)INSERT INTO #FlowInfo SELECT 13,'0098',0
INSERT INTO #FlowInfo SELECT 15,'0010',0
INSERT INTO #FlowInfo SELECT 15,'0012',0
SELECT * FROM #tOrder
SELECT * FROM #tmp
SELECT * FROM #FlowInfo------ 下面说下,这结果是怎么来的
------ 按每个订单,记录所出的SKU所对应的流水号以及货架号(Location) ,流水号从大往小获取
------ 如果流水号范围内有坏品 (#tmp 表ImportID 关联 #FlowInfo 表,Ttype=0),则不记录坏评的流水号
------ 比如 #FlowInfo 表中ImportID=13 有个 流水号:0098 是坏品,所以最后结果 0099-0100 , 0080-0097 显示
-------RefNum SKU FlowNo Num Location
-------Ref001 EAY102(black) 0099-0100 2 D127
-------Ref001 EAY102(black) 0080-0097 18 D127if(OBJECT_ID('tempdb..#goodSKU') is not null)
drop table tempdb..#goodSKU;select number,t.*
into #goodSKU
from master.dbo.spt_values sp
join #tmp t
on sp.number between t.FlowNo_From and t.FLowNo_To and [type]='p'
left join #FlowInfo f
on t.ImportID=f.ImportID and sp.number=f.FlowNo and f.Ttype=0
where f.FlowNo is nullif(OBJECT_ID('tempdb..#result') is not null)
drop table tempdb..#result;
create table #result
(RefNum varchar(50),SKU varchar(50),FlowNo varchar(50),Num int,Location varchar(50))declare skuCursor Cursor for
select RefNum,SKU,NUM from #tOrderopen skuCursor
declare @RefNum varchar(50);
declare @SKU varchar(50);
declare @NUM int;fetch next from skuCursor into @RefNum,@SKU,@NUM;
while @@FETCH_STATUS=0
begininsert into #result
select @RefNum,@SKU,'00'+convert(varchar(20),MIN(number))+'-'+'00'+convert(varchar(20),MAX(number))FLowNo
,MAX(number)-MIN(number)+1 as num,Location
from
(
select number,SKU,Location,FlowNo_From,FlowNo_To,ROW_NUMBER() over(order by number desc) rn
,ROW_NUMBER() over(order by number ) rn2
from #goodSKU
where SKU=@SKU
)t
where rn<=@NUM
group by Location,number-rn2;delete
from #goodSKU
where SKU=@SKU
and number in
(
select number
from
(
select number,SKU,Location,ROW_NUMBER() over(order by number desc) rn
from #goodSKU
where SKU=@SKU
)t
where rn<=@NUM
)
fetch next from skuCursor into @RefNum,@SKU,@NUM
endclose skuCursor;
deallocate skuCursor;
select *
from #Result
--drop table #tmp
--drop table #FlowInfo
--drop table #tOrder
--drop table #Result
不知道不使用个游标,是否可以实现。另外我想把#tmp 表数据,弄成最后查询的结果那样,不知可否实现
想把 OrderNum 的数量分配到对应的流水号 区域内(FlowNo_From,FLowNo_To),其中Num 是指这个区域内可用的流水号数量。 CREATE TABLE #tmp
(
ImportID INT, ----#Import 表ID
SKU VARCHAR(20), ----SKU 编号
FlowNo_From VARCHAR(10),----流水号起始
FLowNo_To VARCHAR(10), ----流水号截止
Location VARCHAR(10), ----货架号
Num INT, ----有效流水号数量
RefNum varchar(10), ----订单号
OrderNum int ----订单扣数、
)
INSERT INTO #tmp SELECT 13,'EAY102(black)','0061','0100','D127',39,'Ref001',40
INSERT INTO #tmp SELECT 13,'EAY102(black)','0061','0100','D127',39,'Ref002',20
INSERT INTO #tmp SELECT 13,'EAY102(black)','0031','0060','D126',30,'Ref001',0
INSERT INTO #tmp SELECT 13,'EAY102(black)','0031','0060','D126',30,'Ref002',0
INSERT INTO #tmp SELECT 14,'EAY102(blue)','0001','0100','D124',40,'Ref003',40
INSERT INTO #tmp SELECT 15,'EAY102(green)','0051','0090','D123',40,'Ref004',40
select * From #tmpSELECT 13 as ImportID,'EAY102(black)' AS SKU,'0061' AS FlowNo_From,'0100' AS FLowNo_To,'D127' AS Location ,39 AS Num,'Ref001' AS RefNum,40 AS OrderNum, 39 AS Result
union all
SELECT 13,'EAY102(black)','0061','0100','D127',39,'Ref002',20,0
union all
SELECT 13,'EAY102(black)','0031','0060','D126',30,'Ref001',0,1
union all
SELECT 13,'EAY102(black)','0031','0060','D126',30,'Ref002',0,20
union all
SELECT 14,'EAY102(blue)','0001','0100','D124',40,'Ref003',40,40
union all
SELECT 15,'EAY102(green)','0051','0090','D123',40,'Ref004',40,40
;with t as(
select a.importid,a.sku,a.location,b.number,row_number()over(partition by sku order by location desc,b.number desc) as ord from #tmp a inner join master..spt_values b
on convert(int,a.FlowNo_From)<=b.number
and convert(int,a.FlowNo_to)>=b.number
where b.type='P'
and b.number>0
and not exists(select 1 from #FlowInfo c
where convert(int,c.FlowNo)=b.number
and a.importid=c.importid
and c.Ttype=0)),
t1 as
(select a.refnum,sku,a.num,row_number()over(partition by sku order by sku,refnum asc) as ord from #tOrder a inner join master..spt_values b
on a.num>=b.number
where b.type='P'
and b.number>0)
select t1.refnum,t1.sku,t.location,min(t.number),max(t.number),count(1) from t right join t1
on t.sku=t1.sku
and t1.ord=t.ord
group by t1.refnum,t1.sku,t.location,refnum+convert(nvarchar,t.number+t.ord)
order by t1.refnum,t1.sku,t.location