在论坛中出现的比较难的sql问题:40(子查询 销售和历史库存)
原文:在论坛中出现的比较难的sql问题:40(子查询 销售和历史库存)
所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路。
求教:我有个表有入库时间,有出库时间,我想得到该样式号每月的销售和历史库存
http://bbs.csdn.net/topics/390629790
库结构大概是这样:
货号 样式号 入库时间 出库时间
a001 10 2011-1-10
b002 10 2011-1-10 2011-2-1
c003 10 2012-1-15 2012-2-2
d004 10 2013-2-3 2013-1-5
e005 10 2013-2-3
f006 15 2011-2-15 2011-3-16
g007 15 2011-2-16 2012-3-16
h009 15 2013-1-10
m012 18 2011-1-4
c009 18 2011-4-5 2012-5-6
f008 18 2012-2-19 2013-1-1
e008 18 2013-1-5 2013-2-6
我想得到的结果:
样式号 日期 销售件数 库存件数
10 2011-2 1 1
10 2012-2 1 1
10 2013-1 1 2
15 2011-3 1 0
15 2012-3 1 1
18 2012-5 1 1
18 2013-1 1 1
18 2013-2 1 1
我的解法:
-
if object_id('tb') is not null
-
drop table tb
-
go
-
-
create table tb
-
(
-
[货号] varchar(20),[样式号] int,
-
[入库时间] datetime,
-
[出库时间] datetime
-
)
-
-
insert into tb
-
SELECT 'a001',10,'2011-01-10',null UNION ALL
-
SELECT 'b002',10,'2011-01-10','2011-02-01' UNION ALL
-
SELECT 'c003',10,'2012-01-15','2012-02-02' UNION ALL
-
SELECT 'd004',10,'2013-01-03','2013-01-05' UNION ALL
-
SELECT 'e005',10,'2013-01-03',null UNION ALL
-
SELECT 'f006',15,'2011-02-15','2011-03-16' UNION ALL
-
SELECT 'g007',15,'2011-02-16','2012-03-16' UNION ALL
-
SELECT 'h009',15,'2013-01-10',null UNION ALL
-
SELECT 'm012',18,'2011-01-04',null UNION ALL
-
SELECT 'c009',18,'2011-04-05','2012-05-06' UNION ALL
-
SELECT 'f008',18,'2012-02-19','2013-01-01' UNION ALL
-
SELECT 'e008',18,'2013-01-05','2013-02-06'
-
go
-
-
-
;with t
-
as(
-
select *,
-
row_number() over(partition by 样式号
-
order by 入库时间,出库时间) as rownum
-
from tb
-
),
-
-
tt
-
as
-
(
-
select *,
-
case when 出库时间 is null
-
then (select top 1 出库时间
-
from t t2
-
where t1.样式号 = t2.样式号 and
-
t1.rownum > t2.rownum
-
order by t2.rownum desc)
-
else 出库时间
-
end as prior_row,
-
-
case when 出库时间 is null
-
then (select top 1 出库时间
-
from t t2
-
where t1.样式号 = t2.样式号 and
-
t1.rownum < t2.rownum
-
order by t2.rownum )
-
else 出库时间
-
end as next_row
-
-
from t t1
-
),
-
-
ttt
-
as
-
(
-
select 样式号,
-
convert(varchar(7),isnull(next_row,prior_row),120) as 日期,
-
count(出库时间) 销售件数,
-
count(入库时间) 库存件数,
-
count(入库时间) - count(出库时间) 剩余库存
-
--row_number() over(partition by 样式号
-
--order by convert(varchar(7),isnull(next_row,prior_row),120)) as rownum
-
from tt
-
group by 样式号,
-
convert(varchar(7),isnull(next_row,prior_row),120)
-
-
)
-
-
select t1.样式号,t1.日期,
-
isnull(t1.销售件数,0) as 销售件数 ,
-
-
isnull(t1.库存件数,0) +
-
isnull((select sum(库存件数)-sum(销售件数) as 剩余库存 from ttt t2
-
where t2.样式号 = t1.样式号
-
and t2.日期 < t1.日期
-
),0) -
-
isnull(t1.销售件数,0) as 库存件数
-
-
from ttt t1
-
order by t1.样式号
-
/*
-
样式号 日期 销售件数 库存件数
-
10 2011-02 1 1
-
10 2012-02 1 1
-
10 2013-01 1 2
-
15 2011-03 1 0
-
15 2012-03 1 1
-
18 2012-05 1 1
-
18 2013-01 1 1
-
18 2013-02 1 1
-
*/
在论坛中出现的比较难的sql问题:40(子查询 销售和历史库存)的更多相关文章
- 在论坛中出现的比较难的sql问题:46(日期条件出现的奇怪问题)
原文:在论坛中出现的比较难的sql问题:46(日期条件出现的奇怪问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得有 ...
- 在论坛中出现的比较难的sql问题:45(用户在线登陆时间的小时、分钟计算问题)
原文:在论坛中出现的比较难的sql问题:45(用户在线登陆时间的小时.分钟计算问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. ...
- 在论坛中出现的比较难的sql问题:44(触发器专题 明细表插入数据时调用主表对应的数据)
原文:在论坛中出现的比较难的sql问题:44(触发器专题 明细表插入数据时调用主表对应的数据) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决 ...
- 在论坛中出现的比较难的sql问题:42(动态行转列 考勤时间动态列)
原文:在论坛中出现的比较难的sql问题:42(动态行转列 考勤时间动态列) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.
- 在论坛中出现的比较难的sql问题:41(循环替换 循环替换关键字)
原文:在论坛中出现的比较难的sql问题:41(循环替换 循环替换关键字) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.
- 在论坛中出现的比较难的sql问题:39(动态行转列 动态日期列问题)
原文:在论坛中出现的比较难的sql问题:39(动态行转列 动态日期列问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉 ...
- 在论坛中出现的比较难的sql问题:38(字符拆分 字符串检索问题)
原文:在论坛中出现的比较难的sql问题:38(字符拆分 字符串检索问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得 ...
- 在论坛中出现的比较难的sql问题:37(动态行转列 某一行数据转为列名)
原文:在论坛中出现的比较难的sql问题:37(动态行转列 某一行数据转为列名) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.
- 在论坛中出现的比较难的sql问题:36(动态行转列 解析json格式字符串)
原文:在论坛中出现的比较难的sql问题:36(动态行转列 解析json格式字符串) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.
随机推荐
- Spring Boot Actuator:健康检查、审计、统计和监控(转)
Spring Boot Actuator可以帮助你监控和管理Spring Boot应用,比如健康检查.审计.统计和HTTP追踪等.所有的这些特性可以通过JMX或者HTTP endpoints来获得. ...
- CentOS / RHEL 7 更改时区
timedatectl 是 RHEL7 上的一项新功能.它可用于查询和更改系统时钟及其设置. 按照以下步骤将时区更改为中国.(以root用户身份执行以下命令). 1.使用以下命令列出所有可用的时区.你 ...
- osg坐标位置转换
osg::Vec3f vec3f1 = hookNode->getBound().center(); osg::NodePathList nodePAthList1 = hookNode-> ...
- 泡泡一分钟:LandmarkBoost: Efficient Visual Context Classifiers for Robust Localization
Marcin Dymczyk, Igor Gilitschenski, Juan Nieto, Simon Lynen, Bernhard Zeis, and Roland Siegwart Land ...
- TLS握手协议分析与理解——某HTTPS请求流量包分析
https://xz.aliyun.com/t/1039 HTTPS简介 HTTPS,是一种网络安全传输协议,在HTTP的基础上利用SSL/TLS来对数据包进行加密,以提供对网络服务器的身份认证,保护 ...
- 全面系统Python3入门+进阶-1-2 Python的特性
结束
- Spring cloud微服务安全实战-3-3 API安全机制之流控
首先要保证你的服务是可用的,其中一个重要的手段就是流控.就是流量控制.比如我的系统每秒只能处理500个请求,那么多余的请求就拒绝掉.这样我的系统不会被压死 实际的开发中,所要面对的流控场景实际是非常复 ...
- ES6深入浅出-13 Proxy 与 Reflect-1.Reflect 反射
阮一峰 http://es6.ruanyifeng.com/#docs/reflect MDN有一些简陋的介绍 https://developer.mozilla.org/zh-CN/docs/We ...
- bat函数调用 带返回值
bat 脚本之 使用函数 摘自:https://blog.csdn.net/peng_cao/article/details/73999076 综述 bat函数写法 bat函数调用 bat函数返回值 ...
- JFreechart从入门到放弃
JFreechart从入门到放弃 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 http://www.jfree.org/jfreechart/ 引言 干嘛用的 使用java画图, ...