SQL Server通过盘点更正计算项目的当前库存

6uxekuva  于 2023-02-07  发布在  SQL Server
关注(0)|答案(1)|浏览(137)

首先,如果这是在某个地方回答的,我道歉。
我试着思考以下问题:我有一个查询,它从一个产品的库存中返回以下值:
| 行ID|进入|退出|盘点|
| - ------|- ------|- ------|- ------|
| 1个|无|无|小行星2880|
| 第二章|小行星1200|无|无|
| 三个|无|八百|无|
| 四个|无|八百|无|
| 五个|无|四百八十|二○ ○ ○年|
| 六个|六百|无|无|
| 七|无|八百|无|
| 八个|无|一千|无|
这部分很简单,但结果应该如下所示:
| 行ID|产品ID|进入|退出|盘点|当前库存|
| - ------|- ------|- ------|- ------|- ------|- ------|
| 1个|三个|无|无|小行星2880|小行星2880|
| 第二章|三个|小行星1200|无|无|小行星4080|
| 三个|三个|无|八百|无|小行星3280|
| 四个|三个|无|八百|无|小行星2480|
| 五个|三个|无|四百八十|二○ ○ ○年|二○ ○ ○年|
| 六个|三个|六百|无|无|小行星2600|
| 七|三个|无|八百|无|小行星1800|
| 八个|三个|无|一千|无|八百|
由此,最终库存值为800件:
| 产品ID|当前库存|
| - ------|- ------|
| 三个|八百|
CurrentStock列中的值是根据Entry、销售和StockTaking列计算得出的。当开始时盘点很简单时(对于本示例,假设所有产品都从盘点开始),在RowId = 1中,CurrentStock等于StockTaking值。
在行Id = 2中,我们有1200件的条目,因此当前库存现在是2880+1200 = 4080件......
现在问题出现在RowID = 5,盘点前CurrentStock是2480件,但是我们只找到了2000件
因此,我们将StockTaking值作为CurrentStock值,以便我们可以从该值向前计算,同时,为了平衡列,我们将退出当时丢失的480件。
我设法在一些临时表上处理这个问题,然后迭代记录并更新CurrentStock值,但对于较大的数据集,这需要一些时间。
如果您对如何使用CTE处理此问题以避免写入临时表提出任何建议,我们将不胜感激。
谢谢

8zzbczxx

8zzbczxx1#

一个有点快的肮脏的解决方案:

select  *
,   SUM(StockTaking + CASE WHEN StockTaking <= 0 THEN Entry - [Exit] ELSE 0 END) OVER(PARTITION BY StockGroup ORDER BY RowId) CurrentStock
from (
    select  COUNT(CASE WHEN StockTaking > 0 THEN 1 END) OVER(ORDER BY RowID) AS StockGroup
    ,   *
    from 
    (
        VALUES  (1, 0, 0, 2880)
        ,   (2, 1200, 0, 0)
        ,   (3, 0, 800, 0)
        ,   (4, 0, 800, 0)
        ,   (5, 0, 480, 2000)
        ,   (6, 600, 0, 0)
        ,   (7, 0, 800, 0)
        ,   (8, 0, 1000, 0)
    ) t (RowId,Entry,[Exit],StockTaking)
) x

首先,通过将每个库存行作为一个组的开始计数来创建行组。然后,汇总按rowID排序的库存更改。
重要的是,对于进行盘点的行,我们不添加进入/退出值。因此,如果您首先进行盘点,然后在同一“行”进行盘点,它将显示错误的结果。也许您有信息可以解决这个问题,但它不在您的示例中。

相关问题