34,594
社区成员
发帖
与我相关
我的任务
分享
--如果当天有进有出,当天最大库存,只算进不算出,则:
;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
/*
货号 当前库存 日期
1 8 2013-07-05 00:00:00.000
2 6 2013-07-03 00:00:00.000
*/
CREATE TABLE #temp(货号 INT, 数量 INT, 入库日期 DATETIME, 出库日期 DATETIME)
INSERT #temp
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'
--如果当天有进有出,当天最大库存,只算进不算出,则:
;WITH cte AS
(
SELECT 货号,数量,日期=入库日期 FROM #temp
UNION ALL
),
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
/*
货号 当前库存 日期
1 8 2013-07-05 00:00:00.000
2 6 2013-07-03 00:00:00.000
*/
CREATE TABLE #temp(货号 INT, 数量 INT, 入库日期 DATETIME, 出库日期 DATETIME)
INSERT #temp
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'
--看一下是不是你想要的结果:
;WITH cte AS
(
SELECT 货号,数量,日期=入库日期 FROM #temp
UNION ALL
SELECT 货号,数量=-数量,出库日期 FROM #temp
--ORDER BY 货号, 日期
),
cte1 AS
(
SELECT
货号,
当前库存=(SELECT SUM(数量) FROM cte B WHERE b.货号=a.货号 AND b.日期<=a.日期),
日期
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
/*
货号 当前库存 日期
1 8 2013-07-05 00:00:00.000
2 5 2013-07-03 00:00:00.000
*/
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.货号