It seems that you (or someone else?) deleted the other two questions, so I guess is the one to work with.
Here is a solution. Before I present it, I need to say few things. This is nothing you can take as spoonfood, but you need to read it closely and make sure that you understand it. I recommend that you look at the output from each CTE.
The reason for this is that I had make some assumptions of what result you want when there is more data. My assumptions may be wrong. But you may be able to correct my query. A few things:
- I've assumed that when there is a new C row after an A, it all starts over.
- Other status values can be ignored.
- The customers are indepedent of each other.
- The grpno that appears group each sequence of C and A rows. A C row that comes just before an A row, counts as an A row.
Here it goes. I added some more sample data:
DROP TABLE IF EXISTS tbl_Fact
go
create table tbl_Fact(
IdCmd int,
DateCMD datetime,
DateLIV datetime,
Stat varchar(15),
CA int,
CUST int
)
insert into tbl_Fact
select 1,'2016-05-15',null,'C',100,1
union all
select 2,'2016-05-20',null,'C',110,1
union all
select 3,'2016-05-22',null,'C',120,1
union all
select 4,'2016-05-22',null,'C',80,2
union all
select 5,'2016-05-24',null,'C',100,2
union all
select 6,'2016-05-26',null,'C',120,1
union all
select 7,'2016-05-27','2016-05-29','A',60,1
union all
select 8,'2016-05-28','2016-05-29','A',60,1
union all
select 9,'2017-01-15',null,'C',11000,1
union all
select 10,'2017-01-16',null,'D',1100,1
union all
select 11,'2017-05-15',null,'C',1100,1
union all
select 12,'2017-05-20',null,'C',1110,1
union all
select 13,'2017-05-22',null,'C',1120,1
union all
select 14,'2017-05-22',null,'C',180,2
union all
select 15,'2017-05-24',null,'C',1100,2
union all
select 16,'2017-05-26',null,'C',1120,1
union all
select 17,'2017-05-27','2016-05-29','A',160,1
union all
select 18,'2017-05-28','2016-05-29','A',160,1
go
; WITH CTE1 AS (
SELECT IdCmd, DateCMD, DateLIV, CA, CUST, Stat,
ModStat = IIF (Stat = 'C' AND LEAD(Stat) OVER (PARTITION BY CUST ORDER BY IdCmd) = 'A', 'A', Stat),
CASign = IIF(Stat = 'A', -1, 1)
FROM tbl_Fact
WHERE Stat IN ('C', 'A')
), CTE2 AS (
SELECT IdCmd, DateCMD, DateLIV, CA, CASign, CUST, Stat,ModStat,
cstrowno = row_number() OVER(PARTITION BY CUST ORDER BY DateCMD, IdCmd),
cststatrowno = row_number() OVER(PARTITION BY CUST, ModStat ORDER BY DateCMD, IdCmd)
FROM CTE1
), CTE3 AS (
SELECT IdCmd, DateCMD, DateLIV, CA, CASign, CUST, Stat, ModStat,
grpno = cststatrowno - cstrowno
FROM CTE2
)
SELECT IdCmd, DateCMD, DateLIV, Stat, CA, CUST,
MaxVal = CASE WHEN ModStat = 'C' THEN
CASE WHEN CA = MAX(CA) OVER (PARTITION BY CUST, grpno) THEN CA END
WHEN ModStat = 'A' THEN
SUM(CA*CASign) OVER(PARTITION BY CUST, grpno
ORDER BY DateCMD, IdCmd ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
END
FROM CTE3
ORDER BY CUST, IdCmd