【问题标题】:How can I populate a balance field in SQL with grouped Part Numbers如何使用分组的零件号填充 SQL 中的余额字段
【发布时间】:2021-09-20 18:48:34
【问题描述】:

我在一个表中有超过 800,000 行。这是我所拥有的一个例子。我想要做的是运行一个更新查询来填充 Balance 列。

Part No Current QOH Supply Demand Balance Previous Part No ID
ABC123 15 0 1 1
ABC123 15 5 3 ABC123 2
ABC123 15 0 5 ABC123 3
DEF321 22 0 16 ABC123 4
DEF321 22 0 3 DEF321 5
DEF321 22 30 5 DEF321 6
DEF321 22 0 1 DEF321 7
DEF321 22 14 4 DEF321 8
DEF321 22 0 9 DEF321 9
DEF321 22 0 4 DEF321 10

Part Nos很多,都是分组的,如图。

对于组中的第一个零件编号,我想从当前 QOH 开始,减去需求并添加供应。然后对于组中所有剩余的零件编号,我不从当前 QOH 开始,而是从前一行余额开始。然后从那里减去需求并添加供应。一旦我们到达下一组零件编号,我将再次从 Current QOH 开始。我有使用 Lag 填充的上一个部件号。这有助于确定零件编号是否是组中的第一个。

填充余额后,应该如下所示:

Part No Current QOH Supply Demand Balance Previous Part No ID
ABC123 15 0 1 14 1
ABC123 15 5 3 16 ABC123 2
ABC123 15 0 5 11 ABC123 3
DEF321 22 0 16 6 ABC123 4
DEF321 22 0 3 3 DEF321 5
DEF321 22 30 5 28 DEF321 6
DEF321 22 0 1 27 DEF321 7
DEF321 22 14 4 37 DEF321 8
DEF321 22 0 9 28 DEF321 9
DEF321 22 0 4 24 DEF321 10

目前,我将数据加载到 Excel 中,手动填充第一个余额字段,然后应用我复制下来的公式。然后我将数据加载回 SQL。

我还尝试了一个 VB 脚本,它一次查看每一行,然后进行计算并填充 Balance。但是对于 80 万条记录,该脚本需要数小时才能运行。

我正在寻找 SQL 解决方案。

谢谢!

【问题讨论】:

  • 请注意,在 SQL 表中有 rowscolumns,而不是记录或字段。
  • 您使用的是哪个 dbms?
  • MS SQL Server 2012
  • 请提供足够的代码,以便其他人更好地理解或重现问题。

标签: sql sql-server tsql balance


【解决方案1】:

您可以使用window functions 计算您的运行余额,如下所示:

select partNo, CurrentQOH, supply, Demand, 
    First_Value(CurrentQOH) over(partition by partno order by id) 
    + Sum(supply-demand) over(partition by partno order by id) Balance,
    PreviousPartNo, Id
from t

【讨论】:

猜你喜欢
  • 2021-12-05
  • 1970-01-01
  • 1970-01-01
  • 2022-01-05
  • 2014-02-04
  • 2014-07-01
  • 2021-11-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多