27,579
社区成员
发帖
与我相关
我的任务
分享
需求描述:
如下数据,想要根据时间进行核销
2017年1101日,应收A客户500元,20171201日,应收B客户1000元,
2017年12月3日,应收A客户600元,2018年1月1日收了A客户700元
DECLARE @T TABLE (BillNo varchar(20),BillDate int,DC SmallInt,
Amount numeric(19,6),ClientId varchar(20))
INSERT INTO @T
SELECT '01',20171101,1,500,'A客户' UNION ALL
SELECT '02',20171201,1,1000,'B客户' UNION ALL
SELECT '03',20171203,1,600,'A客户' UNION ALL
SELECT '04',20180101,-1,700,'A客户'
--想要的效果
BillNo BillDate DC Amount ClientId 核销余额
01 20171101 1 500.000000 A客户 0
02 20171201 1 1000.000000 B客户 1000
03 20171203 1 600.000000 A客户 400
04 20180101 -1 700.000000 A客户 0
DECLARE @T TABLE (BillNo varchar(20),BillDate int,DC SmallInt,
Amount numeric(19,6),ClientId varchar(20))
INSERT INTO @T
SELECT '01',20171101,1,500,'A客户' UNION ALL
SELECT '02',20171201,1,1000,'B客户' UNION ALL
SELECT '03',20171203,1,600,'A客户' UNION ALL
SELECT '04',20180101,-1,700,'A客户'
;WITH CTE
AS
(SELECT *,ROW_NUMBER() OVER (ORDER BY BILLDATE) AS SEQ FROM @T A)
SELECT A.*,
CASE WHEN (DC=-1 OR (DC=1 AND (SUB_PAYMENT>=SUB_BALANCE))) THEN 0
WHEN DC=1 AND SUB_PAYMENT<SUB_BALANCE THEN SUB_BALANCE-SUB_PAYMENT
END AS 核销余额
FROM CTE A
OUTER APPLY (SELECT ISNULL(SUM(AMOUNT),0) AS SUB_BALANCE FROM CTE WHERE ClientId=A.ClientId AND SEQ<=A.SEQ AND DC=1) AS B
OUTER APPLY (SELECT ISNULL(SUM(AMOUNT),0) AS SUB_PAYMENT FROM CTE WHERE ClientId=A.ClientId AND BILLDATE>=A.BILLDATE AND DC=-1) AS C
DECLARE @T TABLE (BillNo varchar(20),BillDate int,DC SmallInt,
Amount numeric(19,6),ClientId varchar(20))
INSERT INTO @T
SELECT '01',20171101,1,500,'A客户' UNION ALL
SELECT '02',20171201,1,1000,'B客户' UNION ALL
SELECT '03',20171203,1,600,'A客户' UNION ALL
SELECT '04',20180101,-1,700,'A客户'
--select * from @t
;with t as (
select ClientId,sum(amount) as amounts from @t where dc=-1 group by ClientId
),tt as (
select *,ROW_NUMBER() over(partition by clientId order by BillNo) as rowid from @t where dc=1
),ttt as (
select a.*,a.Amount-isnull(b.Amounts,0) as ye from tt a left join t b on a.ClientId=b.ClientId where rowid=1
union all
select a.*,a.amount+b.ye from tt a,ttt b where a.ClientId=b.ClientId and a.rowid=b.rowid+1
)
select BillNo,BillDate,DC,Amount,ClientId,(case when ye is null then 0 when ye<0 then 0 else convert(int,ye) end) as 核销余额 from ttt
union all
select *,0 from @t where dc=-1
刚才的有点小问题DECLARE @T TABLE (BillNo varchar(20),BillDate int,DC SmallInt,
Amount numeric(19,6),ClientId varchar(20))
INSERT INTO @T
SELECT '01',20171101,1,500,'A客户' UNION ALL
SELECT '02',20171201,1,1000,'B客户' UNION ALL
SELECT '03',20171203,1,600,'A客户' UNION ALL
SELECT '04',20180101,-1,700,'A客户'
--select * from @t
;with t as (
select ClientId,sum(amount) as amounts from @t where dc=-1 group by ClientId
),tt as (
select *,ROW_NUMBER() over(partition by clientId order by BillNo) as rowid from @t where dc=1
),ttt as (
select a.*,a.Amount-isnull(b.Amounts,0) as ye from tt a left join t b on a.ClientId=b.ClientId where rowid=1
union all
select a.*,a.amount+b.ye from tt a,ttt b where a.ClientId=b.ClientId and a.rowid=b.rowid+1
)
select BillNo,BillDate,DC,Amount,ClientId,(case when ye is null then 0 when ye<0 then 0 else convert(int,ye) end) as 核销余额 from ttt
union all
select *,0 from @t where dc=-1
刚才的有点小问题DECLARE @T TABLE (BillNo varchar(20),BillDate int,DC SmallInt,
Amount numeric(19,6),ClientId varchar(20))
INSERT INTO @T
SELECT '01',20171101,1,500,'A客户' UNION ALL
SELECT '02',20171201,1,1000,'B客户' UNION ALL
SELECT '03',20171203,1,600,'A客户' UNION ALL
SELECT '04',20180101,-1,700,'A客户'
--select * from @t
;with t as (
select ClientId,sum(amount) as amounts from @t where dc=-1 group by ClientId
),tt as (
select *,ROW_NUMBER() over(partition by clientId order by BillNo) as rowid from @t where dc=1
),ttt as (
select a.*,a.Amount-b.Amounts as ye from tt a left join t b on a.ClientId=b.ClientId where rowid=1
union all
select a.*,a.amount+b.ye from tt a,ttt b where a.ClientId=b.ClientId and a.rowid=b.rowid+1
)
select BillNo,BillDate,DC,Amount,ClientId,(case when ye<0 then 0 else ye end) as 核销余额 from ttt