22,209
社区成员
发帖
与我相关
我的任务
分享
;WITH TT
AS
(SELECT WEEK,itemid,CASE WHEN RIGHT(CONVERT(VARCHAR,week),2) = '00' THEN qty ELSE - qty END AS qty
FROM tb1),
T1
AS(
SELECT TOP 100 A.week,a.itemid,a.qty,CASE WHEN SUM(b.qty) > 0 THEN 0 ELSE SUM(b.qty) END AS sqty,
CASE WHEN SUM(b.qty)<0 THEN 1 ELSE 0 END AS mark
FROM TT A
INNER JOIN TT B ON A.itemid = B.itemid AND A.[week] >= b.[week]
GROUP BY A.week,a.itemid,a.qty
ORDER BY a.itemid,a.week
),
T2
AS(
SELECT *,ROW_NUMBER() OVER(PARTITION BY itemid,mark ORDER BY week ) AS num
FROM T1)
SELECT week ,
itemid ,
CASE WHEN EXISTS ( SELECT 1 --这个地方加个判断即可
FROM T2
WHERE sqty < 0 )
THEN CASE WHEN sqty < 0
AND num = 1 THEN ABS(sqty)
ELSE ABS(qty)
END
ELSE CASE WHEN num = 1 THEN ABS(qty)
ELSE 0
END
END AS qty
FROM T2
if object_id('[TB1]') is not null drop table [TB1]
go
create table [TB1] (WEEK int,ItemID int,Qty int)
insert into [TB1]
select 201300,1001,500 union all
select 201311,1001,300 union all
select 201312,1001,300 union all
select 201313,1001,500 union all
select 201314,1001,0 union all
select 201300,1002,0 union all
select 201311,1002,300 union all
select 201312,1002,90
select * from [TB1]
WITH TT
AS
(SELECT WEEK,itemid,CASE WHEN RIGHT(CONVERT(VARCHAR,week),2) = '00' THEN qty ELSE -qty END AS qty FROM tb1),
T1
AS(
SELECT TOP 100 A.week,a.itemid,a.qty,CASE WHEN SUM(b.qty) >0 THEN 0 ELSE SUM(b.qty) END AS sqty,CASE WHEN SUM(b.qty)<0 THEN 1 ELSE 0 END AS mark
FROM TT A
INNER JOIN TT B ON A.itemid = B.itemid AND A.[week]>=b.[week]
GROUP BY A.week,a.itemid,a.qty
ORDER BY a.itemid,a.week),
T2
AS(
SELECT *,ROW_NUMBER() OVER(PARTITION BY itemid,mark ORDER BY week ) AS num
FROM T1)
SELECT week,itemid,CASE WHEN sqty <0 AND num =1 THEN ABS(sqty) ELSE ABS(qty) END AS qty
FROM T2
/*
week itemid qty
201300 1001 500
201311 1001 300
201312 1001 100
201313 1001 500
201314 1001 0
201300 1002 0
201311 1002 300
201312 1002 90*/