大家好,关于昨天的配货帖

liujiayu10 2016-08-04 10:33:35
以下可以否通过游标实现?
http://bbs.csdn.net/topics/391994788 这是昨天的帖子和版主的解答,已经实现了我要的功能,但我还想试试其他方法

是这样的,我现在做一个系统,用C#+sql开发,需要实现的功能是:
库存中有存货001 5个,客户的订单分别如下:
时间 编码 订单数 已配货数 可配货数
2016-01-01 001 2个 0 0
2016-01-02 001 4个 0 0
2016-01-03 001 1个 0 0

希望通过遍历订单表,按时间顺序自动分配,结果如下:
时间 编码 订单数 已配货数 可配货数
2016-01-01 001 2个 0 2
2016-01-02 001 4个 0 3
2016-01-03 001 1个 0 0

保存后结果如下:
时间 编码 订单数 已配货数 可配货数
2016-01-01 001 2个 2 0
2016-01-02 001 4个 3 0
2016-01-03 001 1个 0 0


如果库存再增加的话,再重新匹配可配货数。
我现在用C#代码实现了,但是效率很差,我希望能用SQL实现

谢谢
...全文
177 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
道素 2016-08-04
  • 打赏
  • 举报
回复

;WITH p(ItemID,AvaiableQty) AS (
	SELECT '001',5
),o(oDate,ItemID,oQty) AS (
	SELECT '2016-01-01','001', 2 UNION ALL
	SELECT '2016-01-02','001', 4 UNION ALL
	SELECT '2016-01-03','001', 1
)

   SELECT a.*,CASE WHEN c.uQty>=p.AvaiableQty THEN 0 ELSE 
   	          CASE WHEN p.AvaiableQty-ISNULL(c.uQty,0)>=a.oQty THEN a.oQty ELSE p.AvaiableQty-ISNULL(c.uQty,0) END
   	        END as UsedQty 
   	        ,CASE WHEN  p.AvaiableQty-isnull(c.uQty,0)>=0 THEN p.AvaiableQty-isnull(c.uQty,0) ELSE 0 END AS AvailableQty      
   FROM o AS a
   LEFT JOIN p ON p.ItemID=a.ItemID
   OUTER APPLY(SELECT SUM(b.oQty) AS uQty FROM o AS b WHERE a.ItemID=b.ItemID AND b.oDate<a.oDate) AS c

/*
oDate	ItemID	oQty	UsedQty	AvailableQty
2016-01-01	001	2	2	5
2016-01-02	001	4	3	3
2016-01-03	001	1	0	0
*/

22,206

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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