27,580
社区成员
发帖
与我相关
我的任务
分享
---2012 +
WITH A(Item,StockID,Qty)AS(
SELECT '010101',5,1000 UNION ALL
SELECT '010102',5,2000
),B(Item,StockID,InQty,OutQty,TransDate)AS(
SELECT '010101',5,100,50,CONVERT(DATE,'2016-01-08') UNION ALL
SELECT '010102',5,100,50,'2016-01-08' UNION ALL
SELECT '010101',5,50,5,'2016-01-09'
)
SELECT SUM(b.InQty-b.OutQty)OVER( PARTITION BY b.Item,b.StockID ORDER BY b.TransDate)-(b.InQty-b.OutQty)+ISNULL(a.Qty,0) AS FromQty
,b.Item,b.StockID,b.InQty,b.OutQty,b.TransDate,SUM(b.InQty-b.OutQty)OVER( PARTITION BY b.Item,b.StockID ORDER BY b.TransDate)+ISNULL(a.Qty,0) AS ToQty
FROM b LEFT JOIN A ON b.Item=a.Item AND b.StockID=a.StockID
--under 2012
WITH A(Item,StockID,Qty)AS(
SELECT '010101',5,1000 UNION ALL
SELECT '010102',5,2000
),B(Item,StockID,InQty,OutQty,TransDate)AS(
SELECT '010101',5,100,50,CONVERT(DATE,'2016-01-08') UNION ALL
SELECT '010102',5,100,50,'2016-01-08' UNION ALL
SELECT '010101',5,50,5,'2016-01-09'
)
SELECT p.p_in_qty-(b.InQty-b.OutQty)+ISNULL(a.Qty,0) AS FromQty
,b.Item,b.StockID,b.InQty,b.OutQty,b.TransDate,p.p_in_qty+ISNULL(a.Qty,0) AS ToQty
FROM b
OUTER APPLY(SELECT SUM(InQty-OutQty) AS p_in_qty FROM b AS b1 WHERE b1.Item=b.Item AND b1.StockID=b.StockID AND DATEDIFF(d,b1.TransDate,b.TransDate)>=0) AS p
LEFT JOIN A ON b.Item=a.Item AND b.StockID=a.StockID
FromQty Item StockID InQty OutQty TransDate ToQty
----------- ------ ----------- ----------- ----------- ---------- -----------
1000 010101 5 100 50 2016-01-08 1050
2000 010102 5 100 50 2016-01-08 2050
1050 010101 5 50 5 2016-01-09 1095
DECLARE @InitQty INT =100,@StartDate DATE='2016-08-01'
;WITH tb(in_Date,in_Qty)AS(
select CONVERT(DATE,'2016-10-12'),50 union all
select '2016-10-13',100 union ALL
select '2016-10-14',100 union ALL
select '2016-10-15',100
)
SELECT *,SUM(IN_qty)OVER(ORDER BY tb.in_Date)-tb.in_Qty+@InitQty AS FromQty
,SUM(IN_qty)OVER(ORDER BY tb.in_Date)+@InitQty AS ToQty
FROM tb
WHERE DATEDIFF(d,@StartDate,in_Date)>0
--如果是低于2012
SELECT *,p.p_in_qty-tb.in_qty AS FromQty,p.p_in_qty+@InitQty AS ToQty
--,SUM(IN_qty)OVER(ORDER BY tb.in_Date)-tb.in_Qty+@InitQty AS FromQty
--,SUM(IN_qty)OVER(ORDER BY tb.in_Date)+@InitQty AS ToQty
FROM tb
OUTER APPLY(SELECT SUM(in_qty) AS p_in_qty FROM TB AS t1 WHERE DATEDIFF(d,t1.in_Date,tb.in_Date)>=0) AS p
WHERE DATEDIFF(d,@StartDate,in_Date)>0
in_Date in_Qty FromQty ToQty
---------- ----------- ----------- -----------
2016-10-12 50 100 150
2016-10-13 100 150 250
2016-10-14 100 250 350
2016-10-15 100 350 450
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T(日期 DATE,入库数量 INT,期末数量 INT)
Insert #T
select '2016-10-12',50,150 union all
select '2016-10-13',100,250 union ALL
select '2016-10-14',100,350 union ALL
select '2016-10-15',100,450
Go
--测试数据结束
;WITH temptab
AS ( SELECT * ,
ROW_NUMBER() OVER ( ORDER BY #T.日期 ) AS num
FROM #T
)
SELECT b.日期 ,
( CASE WHEN b.num = 1 THEN ( b.期末数量 - b.入库数量 )
ELSE a.期末数量
END ) AS 期初数量 ,
b.入库数量 ,
b.期末数量
FROM temptab b
LEFT JOIN temptab a ON b.num - 1 = a.num
--测试数据
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T(日期 DATE,入库数量 INT,期末数量 INT)
Insert #T
select '2016-10-12',50,150 union all
select '2016-10-13',100,250 union ALL
select '2016-10-14',100,350 union ALL
select '2016-10-15',100,450
Go
--测试数据结束
;WITH temptab AS (
SELECT *,ROW_NUMBER()OVER(ORDER BY #T.日期) AS num FROM #T
)
SELECT b.日期 ,
a.期末数量 AS 期初数量 ,
b.入库数量 ,
b.期末数量
FROM temptab b
LEFT JOIN temptab a ON b.num - 1 = a.num