先进先出, 用SQL求未出货数据

勉励前行 2014-03-05 12:57:19
一个先进先出进销存的问题:
进货队列,如下表,按时间顺序进货。知道已出货数量120 ,先进先出, 用SQL求未出货数据

进货队列:ID,进货数mCount ,进货时间mTime .
Create table m ( ID int not NULL , mCount int not NULL ,mTime datetime not null)
INSERT into m(ID,mCount,mTime)
SELECT 1,50,'2014-02-01' UNION ALL
SELECT 1,60,'2014-02-02' UNION ALL
SELECT 1,70,'2014-02-03' UNION ALL
SELECT 1,80,'2014-02-04'


SQL返回结果:
ID,进货数mCount ,进货时间mTime,已出货数
1,70,'2014-02-03' 10--这里标示部分出货。
1,80,'2014-02-04' 0

即,已出货的120为最先进货的 50+60+(70-10)


假设mTime进货时间是不重复的。求SQL语句
...全文
239 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Yole 2014-03-05
  • 打赏
  • 举报
回复

select a.id,a.mcount ,a.mtime,a.tmcount,
case when a.mcount-(a.tmcount-120) <0 then 0 else a.mcount-(a.tmcount-120)end as '出货' from
(
select a.*,sum(isnull(b.mcount,0)) as Tmcount from m a left join m b on a.mtime>=b.mtime
group by a.id,a.mcount,a.mtime
)a 
where a.mcount>(a.mcount-(a.tmcount-120))
id mcount mtime tmcount 出货 ----------- ----------- ----------------------- ----------- ----------- 1 70 2014-02-03 00:00:00.000 180 10 1 80 2014-02-04 00:00:00.000 260 0 (2 行受影响)
t101lian 2014-03-05
  • 打赏
  • 举报
回复
引用 5 楼 t101lian 的回复:
[quote=引用 楼主 PPower 的回复:] 一个先进先出进销存的问题: 进货队列,如下表,按时间顺序进货。知道已出货数量120 ,先进先出, 用SQL求未出货数据 1,70,'2014-02-03' 10--这里标示部分出货。 1,80,'2014-02-04' 0 即,已出货的120为最先进货的 50+60+(70-10)
1,70,'2014-02-03' 60--这里标示部分出货。 这里不应该是60吗? 即,已出货的120为最先进货的 50+60+(70-10) 这个加法结果也不对吧 [/quote] 看错啦
t101lian 2014-03-05
  • 打赏
  • 举报
回复
引用 楼主 PPower 的回复:
一个先进先出进销存的问题: 进货队列,如下表,按时间顺序进货。知道已出货数量120 ,先进先出, 用SQL求未出货数据 1,70,'2014-02-03' 10--这里标示部分出货。 1,80,'2014-02-04' 0 即,已出货的120为最先进货的 50+60+(70-10)
1,70,'2014-02-03' 60--这里标示部分出货。 这里不应该是60吗? 即,已出货的120为最先进货的 50+60+(70-10) 这个加法结果也不对吧
發糞塗牆 2014-03-05
  • 打赏
  • 举报
回复
加了个ID为2的,数据是一样的,只是不想太过特例而已
發糞塗牆 2014-03-05
  • 打赏
  • 举报
回复
--Create table m ( ID int not NULL , mCount int not NULL ,mTime datetime not null) 
--INSERT into m(ID,mCount,mTime) 
--SELECT 2,50,'2014-02-01' UNION ALL
--SELECT 2,60,'2014-02-02' UNION ALL
--SELECT 2,70,'2014-02-03' UNION ALL
--SELECT 2,80,'2014-02-04' 

/*
ID,进货数mCount ,进货时间mTime,已出货数
1,70,'2014-02-03' 10--这里标示部分出货。
1,80,'2014-02-04' 0
*/
;WITH cte AS (
SELECT *,ROW_NUMBER()OVER(PARTITION BY id ORDER BY mtime)oid
 FROM m),cte2 AS
 (
 SELECT * ,120-mcount AS [剩余数量] 
 FROM cte
 WHERE oid=1
 UNION ALL 
 SELECT a.id,a.mcount,a.mtime,a.oid,CASE WHEN b.[剩余数量]-a.mcount>=0 THEN b.[剩余数量]-a.mcount ELSE 0  END [剩余数量]--b.[剩余数量] 
 FROM cte a INNER JOIN cte2 b ON a.oid=b.oid+1 AND a.id=b.id
 )
 SELECT id,mcount,mtime,(SELECT [剩余数量] FROM cte2 b WHERE a.id=b.id AND a.oid-1=b.oid)[已出货数]
 FROM cte2 a
 WHERE mcount>(SELECT [剩余数量] FROM cte2 b WHERE a.id=b.id AND a.oid-1=b.oid)
ORDER BY id,oid
 /*
 id          mcount      mtime                   已出货数
----------- ----------- ----------------------- -----------
1           70          2014-02-03 00:00:00.000 10
1           80          2014-02-04 00:00:00.000 0
2           70          2014-02-03 00:00:00.000 10
2           80          2014-02-04 00:00:00.000 0

 */
勉励前行 2014-03-05
  • 打赏
  • 举报
回复
SQL 2005
發糞塗牆 2014-03-05
  • 打赏
  • 举报
回复
sql server多少的?

34,838

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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