使用窗口功能数量直到消耗总量

时间:2017-01-26 04:51:54

标签: sql sql-server

我一直在研究带有窗口函数的CTE,试图确定是否有可能用订单数量更新库存数量记录,直到订单数量被消耗而没有递归方法,因为sql server中引入了窗口函数 我找到了最好的解决方案 这里CTE - recursively update quantity until total consumed

但对于像我这样的初学者来说理解起来非常复杂。请将任何一个转换为具有窗口功能的Cte非常有帮助。 我已经尝试了窗口函数来计算运行数量。但没有成功..我正在使用Sql sevrer 2012 ..请帮我转换窗口函数中的解决方案而不用递归

示例数据:

CREATE TABLE [dbo].[myOrder](
  [Account] [float] NOT NULL,
  [Item] [float] NOT NULL,
  [Quantity] [float] NOT NULL
) ON [PRIMARY]

insert into dbo.myOrder values (12345, 1, 50)

CREATE TABLE [dbo].[myInventory](
  [ID] [int] IDENTITY(1,1) NOT NULL,
  [Account] [float] NOT NULL,
  [InvDate] [numeric](18, 0) NOT NULL,
  [Item] [float] NOT NULL,
  [Quantity] [float] NOT NULL,
  [QuantitySold] [float] NOT NULL
) ON [PRIMARY]

insert into dbo.myInventory values (12345, 111287, 1, 45, 40)
insert into dbo.myInventory values (12345, 111290, 1, 40, 0)
insert into dbo.myInventory values (12345, 111290, 1, 12, 0)
insert into dbo.myInventory values (12345, 111291, 1, 25, 0)


Expected Result:

ID  Account Item    QuantitySoldNew
1   12345   1         5
2   12345   1        40
3   12345   1         5

1 个答案:

答案 0 :(得分:2)

以下是使用SUM Over(Order by)窗口函数

的一种方法
SELECT Id,
       Account,
       InvDate,
       Item,
       QuantitySoldNew = CASE
                           WHEN run_tot < 0 THEN ( [Quantity] - [QuantitySold] ) + run_tot
                           ELSE diff
                         END
FROM   (SELECT mi.*,
               diff=mi.[Quantity] - [QuantitySold],
               run_tot = mo.[Quantity]
                         + Sum(( mi.[Quantity] - [QuantitySold]) *-1)OVER(partition BY mo.account ORDER BY id)
        FROM   [myInventory] mi
               JOIN myOrder mo
                 ON mi.Account = mo.Account
                    AND mi.Item = mo.Item) a
WHERE  CASE WHEN run_tot < 0 THEN ( [Quantity] - [QuantitySold] ) + run_tot ELSE diff END > 0