sql 数据分摊问题

bill81 2014-09-24 03:39:52

一个客户可能对应多个医院,数据中只能取到客户的总额,取不出对应医院完成情况,这里的匹配规则是,销售总额中的金额先满足第一个医院的完成情况,如果有还剩余则向下一个个扣减,直到为0,如果扣减到最后一个,发现有多余的,都放在最后一家,这样的逻辑在T-SQL中如何实现?
请提供源代码
...全文
658 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
jayzhihui 2014-09-26
  • 打赏
  • 举报
回复
能用集合处理的~~~建议都不要用游标,留给其他高手写吧
jayzhihui 2014-09-26
  • 打赏
  • 举报
回复
那结贴送点分呗!
bill81 2014-09-26
  • 打赏
  • 举报
回复
谢谢3楼,我按照3楼方式已经做出来了,很多人建议我用游标处理,想哪位高手能手游标指点一下,谢谢。
Q315054403 2014-09-25
  • 打赏
  • 举报
回复
如果数据量不大,写个游标处理 跟MRP中物料分派逻辑一样 若有预算支持,乐意合作
jayzhihui 2014-09-25
  • 打赏
  • 举报
回复

DECLARE @TABLE TABLE 
(
  客户  varchar(10),
  医院  NVARCHAR(10),
  合同金额  INT,
  销售总额  INT
)

insert into @TABLE values
('A','H1',100,300),
('A','H2',120,300),
('B','H3',80,60),
('C','H4',90,120),
('C','H5',100,120),
('C','H6',50,120);

WITH CTE AS
(
  SELECT *,ROW_NUMBER()over(order by 客户) id 
  FROM @TABLE A
)  
,cte1 as
(
  select a.*,sumqty=(select SUM(合同金额) from CTE where 客户 = a.客户 and id <= a.id),
    jcqty = 销售总额 - (select SUM(合同金额) from CTE where 客户 = a.客户 and id <= a.id) 
  from CTE a
)
,cte2 as
(	
	select 
	  id,客户,医院,合同金额,sumqty,jcqty,销售总额,
	  完成情况 = 
	  case when jcqty >= 0 then 合同金额
		   when jcqty <0 and ABS(jcqty)<=合同金额  then 合同金额 + jcqty
		   when jcqty < 0 and ABS(jcqty)>合同金额 then 0
	       
	   end      
	   
	       
	from cte1
),cte3 as
(
	select *,ROW_NUMBER()over(partition by 客户 order by getdate()) nid from cte2	
)	
select * into #test  from cte3
					  
		  

update a set a.完成情况 = a.完成情况 + jcqty  from	#test a
where jcqty >= 0  and nid =
(select MAX(nid) from #test  where 客户 = A.客户)

select * from #test	 




xdashewan 2014-09-24
  • 打赏
  • 举报
回复
需要用到sql递归和case when,手头没数据库,思路大致是这样
Tiger_Zhao 2014-09-24
  • 打赏
  • 举报
回复
请先给出测试数据的脚本。

27,581

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧