34,872
社区成员
发帖
与我相关
我的任务
分享
use tempdb
if object_id('orders') is not null
drop table orders
if object_id('orderDemand') is not null
drop table orderDemand
go
create table orders(orderID varchar(30),orderqty int)
insert into orders
select 'A',50 union all
select 'B',40 union all
select 'C',1
if object_id('result') is not null
drop table result
create table result(orderID varchar(30),订单 int,[第一周(20)] int,[第二周(20)] int,[第三周(20)] int)
declare @oid varchar(30),@qty int
declare @week1 int,@week2 int,@week3 int
select @week1=20,@week2=50,@week3=21
declare @tmpqty int,@tmpweek1 int,@tmpweek2 int,@tmpweek3 int
declare cur cursor for
select orderID,orderqty from orders
open cur
fetch next from cur into @oid,@qty
set @tmpqty=0
while @@fetch_status=0
begin
set @tmpqty=@tmpqty+@qty
select @tmpweek1=case when @tmpqty>=@week1 then @week1 else @tmpqty end,
@tmpqty=@tmpqty-@tmpweek1,@week1=@week1-@tmpweek1
select @tmpweek2= case when @tmpqty>=@week2 then @week2 else @tmpqty end,
@tmpqty=@tmpqty-@tmpweek2,@week2=@week2-@tmpweek2
select @tmpweek3= case when @tmpqty>=@week3 then @week3 else @tmpqty end,
@tmpqty=@tmpqty-@tmpweek3,@week3=@week3-@tmpweek3
insert into result
select @oid,@qty,@tmpweek1 ,@tmpweek2,@tmpweek3
fetch next from cur into @oid,@qty
end
close cur
deallocate cur
select * from result
IF OBJECT_ID('周安排表')IS NOT NULL
DROP TABLE 周安排表
GO
;WITH [CTE]([周],[数量])AS(
SELECT'1',20
UNION ALL SELECT'2','50'
UNION ALL SELECT'3','21'
)
SELECT [周],[数量] INTO 周安排表 FROM CTE
IF OBJECT_ID('订单表')IS NOT NULL
DROP TABLE 订单表
GO
;WITH [CTE]([订单],[数量])AS(
SELECT'A',50
UNION ALL SELECT'B','40'
UNION ALL SELECT'C','1'
)
SELECT [订单],[数量] INTO 订单表 FROM CTE
--以上模拟数据
--以下开始查询
;WITH T1 AS(
SELECT ROW_NUMBER()OVER(ORDER BY 周)RN1,*
FROM 周安排表
)
,T2 AS(
SELECT ROW_NUMBER()OVER(ORDER BY 订单)RN2,*
FROM 订单表
)
,CTE AS(
SELECT T1.周,T2.订单
,CASE WHEN T1.数量>T2.数量 THEN T2.数量 ELSE T1.数量 END 数量
,T1.RN1,T2.RN2,T2.数量-T1.数量 [Balance]
FROM T1 JOIN T2 ON T1.RN1=1 AND T2.RN2=1
UNION ALL
SELECT T1.周,T2.订单
,CASE WHEN T1.数量>T2.[Balance] THEN T2.[Balance] ELSE T1.数量 END
,T1.RN1,T2.RN2,T2.[Balance]-T1.数量
FROM T1 JOIN CTE T2 ON T2.[Balance]>0 AND T1.RN1=T2.RN1+1
UNION ALL
SELECT T1.周,T2.订单
,CASE WHEN -T1.[Balance]>T2.数量 THEN T2.数量 ELSE -T1.[Balance] END
,T1.RN1,T2.RN2,T2.数量+T1.[Balance]
FROM CTE T1 JOIN T2 ON T1.[Balance]<0 AND T2.RN2=T1.RN2+1
UNION ALL
SELECT T1.周,T2.订单
,CASE WHEN T1.数量>T2.数量 THEN T2.数量 ELSE T1.数量 END
,T1.RN1,T2.RN2,T2.数量-T1.数量
FROM CTE T0 JOIN T1 ON T0.[Balance]=0 AND T1.RN1=T0.RN1+1
JOIN T2 ON T2.RN2=T0.RN2+1
)
SELECT 周,订单,数量 FROM CTE/*如果需要行转列,则注释这一句
SELECT 订单
,SUM(CASE WHEN 周=1 THEN 数量 ELSE 0 END)[第1周]
,SUM(CASE WHEN 周=2 THEN 数量 ELSE 0 END)[第2周]
,SUM(CASE WHEN 周=3 THEN 数量 ELSE 0 END)[第3周]
FROM CTE
GROUP BY 订单
--*/