求助入库表根据出库表出库数量进行先进先出计算

hitrico 2017-08-11 10:44:52
各位高手好,有个问题求助:
有一个入库表a
编号 入库日期 入库数量 出库数量


另一个出库表
编号 出库日期 出库数量

现在需要写一个入库表中出库数量重算的存储过程,要求按照入库日期先进先出,而且出库日期要大于入库日期。
要怎么写?谢谢
...全文
430 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
hitrico 2017-08-11
  • 打赏
  • 举报
回复
引用 5 楼 appetizing_fish1 的回复:
先进先出主要是要明确每批货物的成本, 楼主你应按照采购日期来做先进先出,而不是入仓日日期.
你好,这个只是我举的一个例子,不是实际应用,主要是要知道怎么写,谢谢
顺势而为1 2017-08-11
  • 打赏
  • 举报
回复
先进先出主要是要明确每批货物的成本, 楼主你应按照采购日期来做先进先出,而不是入仓日日期.
hitrico 2017-08-11
  • 打赏
  • 举报
回复
引用 2 楼 z10843087 的回复:
[quote=引用 楼主 hitrico 的回复:] 各位高手好,有个问题求助: 有一个入库表a 编号 入库日期 入库数量 出库数量 另一个出库表 编号 出库日期 出库数量 现在需要写一个入库表中出库数量重算的存储过程,要求按照入库日期先进先出,而且出库日期要大于入库日期。 要怎么写?谢谢
发一下示例数据,能更好的描述问题[/quote] 入库表a 编号 入库日期 入库数量 出库数量 001 2017-7-1 100 001 2017-7-5 200 001 2017-7-11 200 002 2017-7-2 200 002 2017-7-10 300 另一个出库表 编号 出库日期 出库数量 001 2017-7-12 200 001 2017-7-13 200 002 2017-7-13 100 002 2017-7-15 300 谢谢
hitrico 2017-08-11
  • 打赏
  • 举报
回复
引用 1 楼 sinat_28984567 的回复:
编号是产品编号,两个表管理的字段吗?还是就一种产品?
编号是产品的编号,有不同的产品编号,谢谢
OwenZeng_DBA 2017-08-11
  • 打赏
  • 举报
回复
引用 楼主 hitrico 的回复:
各位高手好,有个问题求助: 有一个入库表a 编号 入库日期 入库数量 出库数量 另一个出库表 编号 出库日期 出库数量 现在需要写一个入库表中出库数量重算的存储过程,要求按照入库日期先进先出,而且出库日期要大于入库日期。 要怎么写?谢谢
发一下示例数据,能更好的描述问题
二月十六 2017-08-11
  • 打赏
  • 举报
回复
编号是产品编号,两个表管理的字段吗?还是就一种产品?
二月十六 2017-08-11
  • 打赏
  • 举报
回复
引用 14 楼 hitrico 的回复:
非常感谢,
记得结贴啊
hitrico 2017-08-11
  • 打赏
  • 举报
回复
引用 13 楼 sinat_28984567 的回复:
[quote=引用 12 楼 hitrico 的回复:] 你好,数据处理出来是这样,怎么样直接update到入库表中呢?谢谢
都select出来了还不会update,懒死你们
--测试数据
if not object_id(N'Tempdb..#入库表') is null
	drop table #入库表
Go
Create table #入库表([编号] nvarchar(23),[入库日期] Date,[入库数量] int,[出库数量] int)
Insert #入库表
select N'001','2017-7-1',100,0 union all
select N'001','2017-7-5',200,0 union all
select N'001','2017-7-11',200,0 union all
select N'002','2017-7-2',200,0 union all
select N'002','2017-7-10',300,0
GO
if not object_id(N'Tempdb..#出库表') is null
	drop table #出库表
Go
Create table #出库表([编号] nvarchar(23),[出库日期] Date,[出库数量] int)
Insert #出库表
select N'001','2017-7-12',200 union all
select N'001','2017-7-13',200 union all
select N'002','2017-7-13',100 union all
select N'002','2017-7-15',300
Go
--测试数据结束
;WITH ctea AS (
Select *,
           ROW_NUMBER() OVER(PARTITION BY [编号] ORDER BY [入库日期]) num1 from #入库表
),cteb AS (
SELECT *,
           ROW_NUMBER() OVER(PARTITION BY [编号] ORDER BY [出库日期]) num2  FROM #出库表
),cte AS (
SELECT  ctea.[编号] ,
        ctea.[入库日期] ,
        ctea.[入库数量] ,
		cteb.出库日期,
        CASE WHEN cteb.出库数量 >= ctea.入库数量 THEN ctea.入库数量
             ELSE cteb.出库数量
        END AS 出库数量 ,
        ctea.入库数量 - cteb.出库数量 AS 剩余数量,
		ctea.num1,
		cteb.num2
FROM    ctea
        LEFT JOIN cteb ON cteb.编号 = ctea.编号
WHERE   num1 = 1
        AND num2 = 1
UNION ALL
SELECT  cte.[编号] ,
        cte.[入库日期] ,
        cte.[入库数量] ,
		cteb.出库日期,
        CASE WHEN cte.剩余数量<= cteb.出库数量 THEN cte.剩余数量
             ELSE cteb.出库数量
        END AS 出库数量 ,
        cte.剩余数量 - cteb.出库数量 AS 剩余数量,
		cte.num1,
		cteb.num2
      FROM cte
      JOIN cteb
        ON cte.编号 = cteb.编号
       AND cteb.num2 = cte.num2 + 1
     WHERE cte.剩余数量 > 0
UNION ALL
SELECT  ctea.[编号] ,
        ctea.[入库日期] ,
        ctea.[入库数量] ,
		cte.出库日期,
        CASE WHEN ABS(cte.剩余数量)>= ctea.入库数量 THEN 0
             ELSE ABS(cte.剩余数量)
        END AS 出库数量 ,
        cte.剩余数量 + ctea.入库数量 AS 剩余数量,
		ctea.num1,
		cte.num2
      FROM cte
      JOIN ctea
        ON cte.编号 = ctea.编号
       AND ctea.num1 = cte.num1 +1
     WHERE cte.剩余数量 < 0
UNION ALL 
    SELECT  ctea.[编号] ,
            ctea.[入库日期] ,
            ctea.[入库数量] ,
            cteb.出库日期 ,
            CASE WHEN cteb.出库数量 >= ctea.入库数量 THEN ctea.入库数量
                 ELSE cteb.出库数量
            END AS 出库数量 ,
            ctea.入库数量 - cteb.出库数量 AS 剩余数量 ,
            ctea.num1 ,
            cteb.num2
    FROM    cte
            JOIN ctea ON cte.编号 = ctea.编号
                         AND ctea.num1 = cte.num1 + 1
            JOIN cteb ON cte.编号 = cteb.编号
                         AND cteb.num2 = cte.num2 + 1
    WHERE   cte.剩余数量 = 0
 UNION ALL 
    SELECT  ctea.编号 ,
            ctea.[入库日期] ,
            ctea.[入库数量] ,
			'' AS 出库日期,
            0 AS 出库数量 ,
            ctea.入库数量 AS 剩余数量 ,
            ctea.num1 ,
            cte.num2
    FROM    cte
            JOIN ctea ON cte.编号 = ctea.编号
                         AND ctea.num1 = cte.num1 + 1
    WHERE   cte.剩余数量 >= 0
            AND NOT EXISTS ( SELECT *
                             FROM   cteb
                             WHERE  cte.编号 = cteb.编号
                                    AND cteb.num2 > cte.num2 )
)
--更新操作
UPDATE  a
SET     出库数量 = t.出库数量
FROM    #入库表 a
        JOIN ( SELECT   编号 ,
                        入库日期 ,
                        入库数量 ,
                        SUM(出库数量) AS 出库数量
               FROM     cte
               GROUP BY 编号 ,
                        入库日期 ,
                        入库数量
             ) t ON t.编号 = a.编号
                    AND t.入库日期 = a.入库日期
                    AND t.入库数量 = a.入库数量
--读取测试结果
SELECT * FROM #入库表
[/quote] 非常感谢,
二月十六 2017-08-11
  • 打赏
  • 举报
回复
引用 12 楼 hitrico 的回复:
你好,数据处理出来是这样,怎么样直接update到入库表中呢?谢谢

都select出来了还不会update,懒死你们
--测试数据
if not object_id(N'Tempdb..#入库表') is null
drop table #入库表
Go
Create table #入库表([编号] nvarchar(23),[入库日期] Date,[入库数量] int,[出库数量] int)
Insert #入库表
select N'001','2017-7-1',100,0 union all
select N'001','2017-7-5',200,0 union all
select N'001','2017-7-11',200,0 union all
select N'002','2017-7-2',200,0 union all
select N'002','2017-7-10',300,0
GO
if not object_id(N'Tempdb..#出库表') is null
drop table #出库表
Go
Create table #出库表([编号] nvarchar(23),[出库日期] Date,[出库数量] int)
Insert #出库表
select N'001','2017-7-12',200 union all
select N'001','2017-7-13',200 union all
select N'002','2017-7-13',100 union all
select N'002','2017-7-15',300
Go
--测试数据结束
;WITH ctea AS (
Select *,
ROW_NUMBER() OVER(PARTITION BY [编号] ORDER BY [入库日期]) num1 from #入库表
),cteb AS (
SELECT *,
ROW_NUMBER() OVER(PARTITION BY [编号] ORDER BY [出库日期]) num2 FROM #出库表
),cte AS (
SELECT ctea.[编号] ,
ctea.[入库日期] ,
ctea.[入库数量] ,
cteb.出库日期,
CASE WHEN cteb.出库数量 >= ctea.入库数量 THEN ctea.入库数量
ELSE cteb.出库数量
END AS 出库数量 ,
ctea.入库数量 - cteb.出库数量 AS 剩余数量,
ctea.num1,
cteb.num2
FROM ctea
LEFT JOIN cteb ON cteb.编号 = ctea.编号
WHERE num1 = 1
AND num2 = 1
UNION ALL
SELECT cte.[编号] ,
cte.[入库日期] ,
cte.[入库数量] ,
cteb.出库日期,
CASE WHEN cte.剩余数量<= cteb.出库数量 THEN cte.剩余数量
ELSE cteb.出库数量
END AS 出库数量 ,
cte.剩余数量 - cteb.出库数量 AS 剩余数量,
cte.num1,
cteb.num2
FROM cte
JOIN cteb
ON cte.编号 = cteb.编号
AND cteb.num2 = cte.num2 + 1
WHERE cte.剩余数量 > 0
UNION ALL
SELECT ctea.[编号] ,
ctea.[入库日期] ,
ctea.[入库数量] ,
cte.出库日期,
CASE WHEN ABS(cte.剩余数量)>= ctea.入库数量 THEN 0
ELSE ABS(cte.剩余数量)
END AS 出库数量 ,
cte.剩余数量 + ctea.入库数量 AS 剩余数量,
ctea.num1,
cte.num2
FROM cte
JOIN ctea
ON cte.编号 = ctea.编号
AND ctea.num1 = cte.num1 +1
WHERE cte.剩余数量 < 0
UNION ALL
SELECT ctea.[编号] ,
ctea.[入库日期] ,
ctea.[入库数量] ,
cteb.出库日期 ,
CASE WHEN cteb.出库数量 >= ctea.入库数量 THEN ctea.入库数量
ELSE cteb.出库数量
END AS 出库数量 ,
ctea.入库数量 - cteb.出库数量 AS 剩余数量 ,
ctea.num1 ,
cteb.num2
FROM cte
JOIN ctea ON cte.编号 = ctea.编号
AND ctea.num1 = cte.num1 + 1
JOIN cteb ON cte.编号 = cteb.编号
AND cteb.num2 = cte.num2 + 1
WHERE cte.剩余数量 = 0
UNION ALL
SELECT ctea.编号 ,
ctea.[入库日期] ,
ctea.[入库数量] ,
'' AS 出库日期,
0 AS 出库数量 ,
ctea.入库数量 AS 剩余数量 ,
ctea.num1 ,
cte.num2
FROM cte
JOIN ctea ON cte.编号 = ctea.编号
AND ctea.num1 = cte.num1 + 1
WHERE cte.剩余数量 >= 0
AND NOT EXISTS ( SELECT *
FROM cteb
WHERE cte.编号 = cteb.编号
AND cteb.num2 > cte.num2 )
)
--更新操作
UPDATE a
SET 出库数量 = t.出库数量
FROM #入库表 a
JOIN ( SELECT 编号 ,
入库日期 ,
入库数量 ,
SUM(出库数量) AS 出库数量
FROM cte
GROUP BY 编号 ,
入库日期 ,
入库数量
) t ON t.编号 = a.编号
AND t.入库日期 = a.入库日期
AND t.入库数量 = a.入库数量
--读取测试结果
SELECT * FROM #入库表


hitrico 2017-08-11
  • 打赏
  • 举报
回复
引用 10 楼 sinat_28984567 的回复:
[quote=引用 9 楼 hitrico 的回复:] 你好,我想直接把出库的数量写入到入库表相应的入库数据的出库数量列中,应该怎么写呢?谢谢
是这样吗?
--测试数据
if not object_id(N'Tempdb..#入库表') is null
	drop table #入库表
Go
Create table #入库表([编号] nvarchar(23),[入库日期] Date,[入库数量] int,[出库数量] int)
Insert #入库表
select N'001','2017-7-1',100,0 union all
select N'001','2017-7-5',200,0 union all
select N'001','2017-7-11',200,0 union all
select N'002','2017-7-2',200,0 union all
select N'002','2017-7-10',300,0
GO
if not object_id(N'Tempdb..#出库表') is null
	drop table #出库表
Go
Create table #出库表([编号] nvarchar(23),[出库日期] Date,[出库数量] int)
Insert #出库表
select N'001','2017-7-12',200 union all
select N'001','2017-7-13',200 union all
select N'002','2017-7-13',100 union all
select N'002','2017-7-15',300
Go
--测试数据结束
;WITH ctea AS (
Select *,
           ROW_NUMBER() OVER(PARTITION BY [编号] ORDER BY [入库日期]) num1 from #入库表
),cteb AS (
SELECT *,
           ROW_NUMBER() OVER(PARTITION BY [编号] ORDER BY [出库日期]) num2  FROM #出库表
),cte AS (
SELECT  ctea.[编号] ,
        ctea.[入库日期] ,
        ctea.[入库数量] ,
		cteb.出库日期,
        CASE WHEN cteb.出库数量 >= ctea.入库数量 THEN ctea.入库数量
             ELSE cteb.出库数量
        END AS 出库数量 ,
        ctea.入库数量 - cteb.出库数量 AS 剩余数量,
		ctea.num1,
		cteb.num2
FROM    ctea
        LEFT JOIN cteb ON cteb.编号 = ctea.编号
WHERE   num1 = 1
        AND num2 = 1
UNION ALL
SELECT  cte.[编号] ,
        cte.[入库日期] ,
        cte.[入库数量] ,
		cteb.出库日期,
        CASE WHEN cte.剩余数量<= cteb.出库数量 THEN cte.剩余数量
             ELSE cteb.出库数量
        END AS 出库数量 ,
        cte.剩余数量 - cteb.出库数量 AS 剩余数量,
		cte.num1,
		cteb.num2
      FROM cte
      JOIN cteb
        ON cte.编号 = cteb.编号
       AND cteb.num2 = cte.num2 + 1
     WHERE cte.剩余数量 > 0
UNION ALL
SELECT  ctea.[编号] ,
        ctea.[入库日期] ,
        ctea.[入库数量] ,
		cte.出库日期,
        CASE WHEN ABS(cte.剩余数量)>= ctea.入库数量 THEN 0
             ELSE ABS(cte.剩余数量)
        END AS 出库数量 ,
        cte.剩余数量 + ctea.入库数量 AS 剩余数量,
		ctea.num1,
		cte.num2
      FROM cte
      JOIN ctea
        ON cte.编号 = ctea.编号
       AND ctea.num1 = cte.num1 +1
     WHERE cte.剩余数量 < 0
UNION ALL 
    SELECT  ctea.[编号] ,
            ctea.[入库日期] ,
            ctea.[入库数量] ,
            cteb.出库日期 ,
            CASE WHEN cteb.出库数量 >= ctea.入库数量 THEN ctea.入库数量
                 ELSE cteb.出库数量
            END AS 出库数量 ,
            ctea.入库数量 - cteb.出库数量 AS 剩余数量 ,
            ctea.num1 ,
            cteb.num2
    FROM    cte
            JOIN ctea ON cte.编号 = ctea.编号
                         AND ctea.num1 = cte.num1 + 1
            JOIN cteb ON cte.编号 = cteb.编号
                         AND cteb.num2 = cte.num2 + 1
    WHERE   cte.剩余数量 = 0
 UNION ALL 
    SELECT  ctea.编号 ,
            ctea.[入库日期] ,
            ctea.[入库数量] ,
			'' AS 出库日期,
            0 AS 出库数量 ,
            ctea.入库数量 AS 剩余数量 ,
            ctea.num1 ,
            cte.num2
    FROM    cte
            JOIN ctea ON cte.编号 = ctea.编号
                         AND ctea.num1 = cte.num1 + 1
    WHERE   cte.剩余数量 >= 0
            AND NOT EXISTS ( SELECT *
                             FROM   cteb
                             WHERE  cte.编号 = cteb.编号
                                    AND cteb.num2 > cte.num2 )
)
SELECT  编号 ,
        入库日期 ,
        入库数量 ,
        SUM(出库数量) AS 出库数量
FROM    cte
GROUP BY 编号 ,
        入库日期 ,
        入库数量
ORDER BY 编号 ,
        入库日期
[/quote] 你好,数据处理出来是这样,怎么样直接update到入库表中呢?谢谢
hitrico 2017-08-11
  • 打赏
  • 举报
回复
引用 8 楼 zengertao 的回复:
LZ这个逻辑不对啊,应该是在出库的时候针对库存中同类货品根据入库日期进行先进先出。 你举的例子好像是反的。 举例: 产品 入库日期 数量 A 2017-01-01 100 A 2017-02-01 200 产品 出库日期 数量 A 2017-02-10 200 这时候你的这单出库应该是先核销1月1号那笔入库的100件A产品,再核销掉第二笔2月1号的100个A产品。其实中间应该有个产品库存和批次号概念。
你好,我是需要了解在两个数据表已有数据的情况下怎么对入库表进行处理,随便举的例子,只是想知道sql要怎么写而已,谢谢
二月十六 2017-08-11
  • 打赏
  • 举报
回复
引用 9 楼 hitrico 的回复:
你好,我想直接把出库的数量写入到入库表相应的入库数据的出库数量列中,应该怎么写呢?谢谢

是这样吗?
--测试数据
if not object_id(N'Tempdb..#入库表') is null
drop table #入库表
Go
Create table #入库表([编号] nvarchar(23),[入库日期] Date,[入库数量] int,[出库数量] int)
Insert #入库表
select N'001','2017-7-1',100,0 union all
select N'001','2017-7-5',200,0 union all
select N'001','2017-7-11',200,0 union all
select N'002','2017-7-2',200,0 union all
select N'002','2017-7-10',300,0
GO
if not object_id(N'Tempdb..#出库表') is null
drop table #出库表
Go
Create table #出库表([编号] nvarchar(23),[出库日期] Date,[出库数量] int)
Insert #出库表
select N'001','2017-7-12',200 union all
select N'001','2017-7-13',200 union all
select N'002','2017-7-13',100 union all
select N'002','2017-7-15',300
Go
--测试数据结束
;WITH ctea AS (
Select *,
ROW_NUMBER() OVER(PARTITION BY [编号] ORDER BY [入库日期]) num1 from #入库表
),cteb AS (
SELECT *,
ROW_NUMBER() OVER(PARTITION BY [编号] ORDER BY [出库日期]) num2 FROM #出库表
),cte AS (
SELECT ctea.[编号] ,
ctea.[入库日期] ,
ctea.[入库数量] ,
cteb.出库日期,
CASE WHEN cteb.出库数量 >= ctea.入库数量 THEN ctea.入库数量
ELSE cteb.出库数量
END AS 出库数量 ,
ctea.入库数量 - cteb.出库数量 AS 剩余数量,
ctea.num1,
cteb.num2
FROM ctea
LEFT JOIN cteb ON cteb.编号 = ctea.编号
WHERE num1 = 1
AND num2 = 1
UNION ALL
SELECT cte.[编号] ,
cte.[入库日期] ,
cte.[入库数量] ,
cteb.出库日期,
CASE WHEN cte.剩余数量<= cteb.出库数量 THEN cte.剩余数量
ELSE cteb.出库数量
END AS 出库数量 ,
cte.剩余数量 - cteb.出库数量 AS 剩余数量,
cte.num1,
cteb.num2
FROM cte
JOIN cteb
ON cte.编号 = cteb.编号
AND cteb.num2 = cte.num2 + 1
WHERE cte.剩余数量 > 0
UNION ALL
SELECT ctea.[编号] ,
ctea.[入库日期] ,
ctea.[入库数量] ,
cte.出库日期,
CASE WHEN ABS(cte.剩余数量)>= ctea.入库数量 THEN 0
ELSE ABS(cte.剩余数量)
END AS 出库数量 ,
cte.剩余数量 + ctea.入库数量 AS 剩余数量,
ctea.num1,
cte.num2
FROM cte
JOIN ctea
ON cte.编号 = ctea.编号
AND ctea.num1 = cte.num1 +1
WHERE cte.剩余数量 < 0
UNION ALL
SELECT ctea.[编号] ,
ctea.[入库日期] ,
ctea.[入库数量] ,
cteb.出库日期 ,
CASE WHEN cteb.出库数量 >= ctea.入库数量 THEN ctea.入库数量
ELSE cteb.出库数量
END AS 出库数量 ,
ctea.入库数量 - cteb.出库数量 AS 剩余数量 ,
ctea.num1 ,
cteb.num2
FROM cte
JOIN ctea ON cte.编号 = ctea.编号
AND ctea.num1 = cte.num1 + 1
JOIN cteb ON cte.编号 = cteb.编号
AND cteb.num2 = cte.num2 + 1
WHERE cte.剩余数量 = 0
UNION ALL
SELECT ctea.编号 ,
ctea.[入库日期] ,
ctea.[入库数量] ,
'' AS 出库日期,
0 AS 出库数量 ,
ctea.入库数量 AS 剩余数量 ,
ctea.num1 ,
cte.num2
FROM cte
JOIN ctea ON cte.编号 = ctea.编号
AND ctea.num1 = cte.num1 + 1
WHERE cte.剩余数量 >= 0
AND NOT EXISTS ( SELECT *
FROM cteb
WHERE cte.编号 = cteb.编号
AND cteb.num2 > cte.num2 )
)
SELECT 编号 ,
入库日期 ,
入库数量 ,
SUM(出库数量) AS 出库数量
FROM cte
GROUP BY 编号 ,
入库日期 ,
入库数量
ORDER BY 编号 ,
入库日期


hitrico 2017-08-11
  • 打赏
  • 举报
回复
引用 7 楼 sinat_28984567 的回复:
--测试数据
if not object_id(N'Tempdb..#入库表') is null
	drop table #入库表
Go
Create table #入库表([编号] nvarchar(23),[入库日期] Date,[入库数量] int,[出库数量] int)
Insert #入库表
select N'001','2017-7-1',100,0 union all
select N'001','2017-7-5',200,0 union all
select N'001','2017-7-11',200,0 union all
select N'002','2017-7-2',200,0 union all
select N'002','2017-7-10',300,0
GO
if not object_id(N'Tempdb..#出库表') is null
	drop table #出库表
Go
Create table #出库表([编号] nvarchar(23),[出库日期] Date,[出库数量] int)
Insert #出库表
select N'001','2017-7-12',200 union all
select N'001','2017-7-13',200 union all
select N'002','2017-7-13',100 union all
select N'002','2017-7-15',300
Go
--测试数据结束
;WITH ctea AS (
Select *,
           ROW_NUMBER() OVER(PARTITION BY [编号] ORDER BY [入库日期]) num1 from #入库表
),cteb AS (
SELECT *,
           ROW_NUMBER() OVER(PARTITION BY [编号] ORDER BY [出库日期]) num2  FROM #出库表
),cte AS (
SELECT  ctea.[编号] ,
        ctea.[入库日期] ,
        ctea.[入库数量] ,
		cteb.出库日期,
        CASE WHEN cteb.出库数量 >= ctea.入库数量 THEN ctea.入库数量
             ELSE cteb.出库数量
        END AS 出库数量 ,
        ctea.入库数量 - cteb.出库数量 AS 剩余数量,
		ctea.num1,
		cteb.num2
FROM    ctea
        LEFT JOIN cteb ON cteb.编号 = ctea.编号
WHERE   num1 = 1
        AND num2 = 1
UNION ALL
SELECT  cte.[编号] ,
        cte.[入库日期] ,
        cte.[入库数量] ,
		cteb.出库日期,
        CASE WHEN cte.剩余数量<= cteb.出库数量 THEN cte.剩余数量
             ELSE cteb.出库数量
        END AS 出库数量 ,
        cte.剩余数量 - cteb.出库数量 AS 剩余数量,
		cte.num1,
		cteb.num2
      FROM cte
      JOIN cteb
        ON cte.编号 = cteb.编号
       AND cteb.num2 = cte.num2 + 1
     WHERE cte.剩余数量 > 0
UNION ALL
SELECT  ctea.[编号] ,
        ctea.[入库日期] ,
        ctea.[入库数量] ,
		cte.出库日期,
        CASE WHEN ABS(cte.剩余数量)>= ctea.入库数量 THEN 0
             ELSE ABS(cte.剩余数量)
        END AS 出库数量 ,
        cte.剩余数量 + ctea.入库数量 AS 剩余数量,
		ctea.num1,
		cte.num2
      FROM cte
      JOIN ctea
        ON cte.编号 = ctea.编号
       AND ctea.num1 = cte.num1 +1
     WHERE cte.剩余数量 < 0
UNION ALL 
    SELECT  ctea.[编号] ,
            ctea.[入库日期] ,
            ctea.[入库数量] ,
            cteb.出库日期 ,
            CASE WHEN cteb.出库数量 >= ctea.入库数量 THEN ctea.入库数量
                 ELSE cteb.出库数量
            END AS 出库数量 ,
            ctea.入库数量 - cteb.出库数量 AS 剩余数量 ,
            ctea.num1 ,
            cteb.num2
    FROM    cte
            JOIN ctea ON cte.编号 = ctea.编号
                         AND ctea.num1 = cte.num1 + 1
            JOIN cteb ON cte.编号 = cteb.编号
                         AND cteb.num2 = cte.num2 + 1
    WHERE   cte.剩余数量 = 0
 UNION ALL 
    SELECT  ctea.编号 ,
            ctea.[入库日期] ,
            ctea.[入库数量] ,
			'' AS 出库日期,
            0 AS 出库数量 ,
            ctea.入库数量 AS 剩余数量 ,
            ctea.num1 ,
            cte.num2
    FROM    cte
            JOIN ctea ON cte.编号 = ctea.编号
                         AND ctea.num1 = cte.num1 + 1
    WHERE   cte.剩余数量 >= 0
            AND NOT EXISTS ( SELECT *
                             FROM   cteb
                             WHERE  cte.编号 = cteb.编号
                                    AND cteb.num2 > cte.num2 )
)
SELECT  编号 ,
        入库日期 ,
        入库数量 ,
        出库日期 ,
        出库数量 ,
        剩余数量
FROM    cte
ORDER BY 编号 ,
        入库日期
你好,我想直接把出库的数量写入到入库表相应的入库数据的出库数量列中,应该怎么写呢?谢谢
繁花尽流年 2017-08-11
  • 打赏
  • 举报
回复
LZ这个逻辑不对啊,应该是在出库的时候针对库存中同类货品根据入库日期进行先进先出。 你举的例子好像是反的。 举例: 产品 入库日期 数量 A 2017-01-01 100 A 2017-02-01 200 产品 出库日期 数量 A 2017-02-10 200 这时候你的这单出库应该是先核销1月1号那笔入库的100件A产品,再核销掉第二笔2月1号的100个A产品。其实中间应该有个产品库存和批次号概念。
二月十六 2017-08-11
  • 打赏
  • 举报
回复
--测试数据
if not object_id(N'Tempdb..#入库表') is null
drop table #入库表
Go
Create table #入库表([编号] nvarchar(23),[入库日期] Date,[入库数量] int,[出库数量] int)
Insert #入库表
select N'001','2017-7-1',100,0 union all
select N'001','2017-7-5',200,0 union all
select N'001','2017-7-11',200,0 union all
select N'002','2017-7-2',200,0 union all
select N'002','2017-7-10',300,0
GO
if not object_id(N'Tempdb..#出库表') is null
drop table #出库表
Go
Create table #出库表([编号] nvarchar(23),[出库日期] Date,[出库数量] int)
Insert #出库表
select N'001','2017-7-12',200 union all
select N'001','2017-7-13',200 union all
select N'002','2017-7-13',100 union all
select N'002','2017-7-15',300
Go
--测试数据结束
;WITH ctea AS (
Select *,
ROW_NUMBER() OVER(PARTITION BY [编号] ORDER BY [入库日期]) num1 from #入库表
),cteb AS (
SELECT *,
ROW_NUMBER() OVER(PARTITION BY [编号] ORDER BY [出库日期]) num2 FROM #出库表
),cte AS (
SELECT ctea.[编号] ,
ctea.[入库日期] ,
ctea.[入库数量] ,
cteb.出库日期,
CASE WHEN cteb.出库数量 >= ctea.入库数量 THEN ctea.入库数量
ELSE cteb.出库数量
END AS 出库数量 ,
ctea.入库数量 - cteb.出库数量 AS 剩余数量,
ctea.num1,
cteb.num2
FROM ctea
LEFT JOIN cteb ON cteb.编号 = ctea.编号
WHERE num1 = 1
AND num2 = 1
UNION ALL
SELECT cte.[编号] ,
cte.[入库日期] ,
cte.[入库数量] ,
cteb.出库日期,
CASE WHEN cte.剩余数量<= cteb.出库数量 THEN cte.剩余数量
ELSE cteb.出库数量
END AS 出库数量 ,
cte.剩余数量 - cteb.出库数量 AS 剩余数量,
cte.num1,
cteb.num2
FROM cte
JOIN cteb
ON cte.编号 = cteb.编号
AND cteb.num2 = cte.num2 + 1
WHERE cte.剩余数量 > 0
UNION ALL
SELECT ctea.[编号] ,
ctea.[入库日期] ,
ctea.[入库数量] ,
cte.出库日期,
CASE WHEN ABS(cte.剩余数量)>= ctea.入库数量 THEN 0
ELSE ABS(cte.剩余数量)
END AS 出库数量 ,
cte.剩余数量 + ctea.入库数量 AS 剩余数量,
ctea.num1,
cte.num2
FROM cte
JOIN ctea
ON cte.编号 = ctea.编号
AND ctea.num1 = cte.num1 +1
WHERE cte.剩余数量 < 0
UNION ALL
SELECT ctea.[编号] ,
ctea.[入库日期] ,
ctea.[入库数量] ,
cteb.出库日期 ,
CASE WHEN cteb.出库数量 >= ctea.入库数量 THEN ctea.入库数量
ELSE cteb.出库数量
END AS 出库数量 ,
ctea.入库数量 - cteb.出库数量 AS 剩余数量 ,
ctea.num1 ,
cteb.num2
FROM cte
JOIN ctea ON cte.编号 = ctea.编号
AND ctea.num1 = cte.num1 + 1
JOIN cteb ON cte.编号 = cteb.编号
AND cteb.num2 = cte.num2 + 1
WHERE cte.剩余数量 = 0
UNION ALL
SELECT ctea.编号 ,
ctea.[入库日期] ,
ctea.[入库数量] ,
'' AS 出库日期,
0 AS 出库数量 ,
ctea.入库数量 AS 剩余数量 ,
ctea.num1 ,
cte.num2
FROM cte
JOIN ctea ON cte.编号 = ctea.编号
AND ctea.num1 = cte.num1 + 1
WHERE cte.剩余数量 >= 0
AND NOT EXISTS ( SELECT *
FROM cteb
WHERE cte.编号 = cteb.编号
AND cteb.num2 > cte.num2 )
)
SELECT 编号 ,
入库日期 ,
入库数量 ,
出库日期 ,
出库数量 ,
剩余数量
FROM cte
ORDER BY 编号 ,
入库日期


22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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