SQL查询求助-历史最大库存问题
数据表格名称:库存
货号 数量 入库日期 出库日期
————————————————————
1 1 20130701 20130710
1 2 20130702 20130704
1 3 20130703 20130708
1 4 20130705 20130706
2 1 20130701 20130703
2 2 20130702 20130705
2 3 20130703 20130704
要求:写出一条SQL语句,返回货号,历史最大库存。
【下方是自己的理解,若您已经理解题意可以跳过】
个人解读:
1.数据解读:就第一行数据来说:一个货物20130701进库,20130710出库,依次类推;历史最大库存,即这些日期中最大有库存的一天。
这里有一个绕人的地方:举例1:仓库一天进1个货物,出一个货物,那么今天最高库存是?答:1个。
举例2:仓库一天上午进4个,下午出2个,历史最高库存是?答:2个。
2.具体方法分析:【若同一天有进有出,默认为先进后出】
入库是增加库存的,所以历史最高库存只产生于有入库的那天,因此可以分为2步解决问题:
(1)求出有入库的每天最高库存
(2)所有有入库的最高库存求MAX
呃。。。本人的思路想计算出每一天的历史最高库存,当天库存+之前的累计库存-该天之前的所有出库数量
然后奋斗了N久,只能写成这样:
SELECT T4.货号,T4.总入库-T3.总出库 历史最高库存
FROM
(
SELECT *
FROM
(
SELECT T.货号,SUM(T.入库数量) 总入库
FROM
(
select 入库日期,货号,sum(数量) 入库数量
from 库存
group by 入库日期,货号
) T
GROUP BY T.货号
) T2
) T4
JOIN
(
SELECT T1.货号,SUM(T1.出库数量) 总出库
FROM
(
select 出库日期,货号,sum(数量) 出库数量
from 库存
WHERE 出库日期<(SELECT MAX(入库日期) FROM 库存)
group by 出库日期,货号
) T1
GROUP BY T1.货号
) T3
ON T4.货号=T3.货号
这样仅仅能实现部分功能:历史最高库存恰恰是最后入库日期当天。
求各位指点赐教! SQL select
[解决办法]
--货号 数量 入库日期 出库日期
WITH a1 (mate_no,qty,in_date,out_date) AS
(
SELECT 1, 1,'20130701','20130710' UNION all
SELECT 1, 2,'20130702','20130704' UNION all
SELECT 1, 3,'20130703','20130708' UNION all
SELECT 1, 4,'20130705','20130706' UNION all
SELECT 2, 1,'20130701','20130703' UNION all
SELECT 2, 2,'20130702','20130705' UNION all
SELECT 2, 3,'20130703','20130704'
)
,a2 AS
(
SELECT mate_no,qty,in_date date_d
FROM a1
UNION ALL
SELECT mate_no,-qty qty,out_date
FROM a1
)
,a3 AS
(
SELECT mate_no,date_d,SUM(qty) qty
FROM a2
GROUP BY mate_no,date_d
)
,a4 AS
(
SELECT *,(SELECT SUM(qty) FROM a3 WHERE mate_no=a.mate_no AND date_d<=a.date_d) end_qty
FROM a3 a
)
SELECT mate_no,MAX(end_qty)
FROM a4
GROUP BY mate_no
[解决办法]
#7楼,少粘了一行。
--如果当天有进有出,当天最大库存,只算进不算出,则:
;WITH cte AS
(
SELECT 货号,数量,日期=入库日期 FROM #temp
UNION ALL
SELECT 货号,数量=-数量,出库日期 FROM #temp
),
cte1 AS
(
SELECT
货号,
当前库存=(SELECT SUM(数量) FROM cte B WHERE b.货号=a.货号 AND (b.日期<a.日期 OR (b.日期=a.日期 AND B.数量> 0))),
日期
FROM cte A
)
SELECT B.* FROM
(SELECT DISTINCT 货号 FROM #temp) a
CROSS APPLY
(SELECT TOP(1) * FROM cte1 m WHERE m.货号=a.货号 ORDER BY m.当前库存 DESC) b
/*
货号当前库存日期
182013-07-05 00:00:00.000
262013-07-03 00:00:00.000
*/