我正在尝试使用 Ms SQL 计算仓库中每件商品的平均每日库存。 每个进出数量都记录在同一列中,我们将其命名为[数量]。由于这种结构,我判断今天的库存水平的唯一方法就是简单地将一开始的所有数量相加。 即
SELECT [item], SUM(quantity)
FROM item_table
如果我想查看昨天的库存水平,我需要以下代码:
SELECT [item], SUM(quantity)
FROM item_table
WHERE [date] < DATEADD(day,-1,GETDATE())
每一天都是如此。当然,我不会为了获得全年的库存水平而手动更改 DATEADD
数字 360 次。因此,我使用 While 循环,如下所示:
DECLARE @intFlag INT
DECLARE @s DECIMAL = 0
DECLARE @i varchar(20) --replaced with table (see table part below)
SET @intFlag = 0
WHILE (@intFlag <= 360)
BEGIN
SET @intFlag = @intFlag + 1
SET @i = (SELECT TOP (1) [item] FROM item_table ) --replaced with table (see table part below)
SET @s = (
SELECT
SUM(quantity) + @s AS inventory
FROM item_table
WHERE
item IN (@i) --replaced with table (see table part below)
AND [Date] < dateadd(day, - @intFlag, GETDATE())
)
IF @intFlag = 360
BREAK;
END
SELECT
@i AS [item],
@s/360 AS [AVG_stock]
到目前为止,这工作正常,但是当我尝试对多个项目执行相同的操作时,我陷入了困境。
当我尝试用如下表格替换 @i
参数时:
DECLARE @items table (number varchar (20))
INSERT INTO @items
SELECT DISTINCT [Item]
FROM items_table
并尝试调用它
SET @s = (
SELECT
SUM(quantity) + @s AS inventory
FROM item_table
WHERE
item IN (@items)
AND [Date] < dateadd(day, - @intFlag, GETDATE())
)
SQL 找不到@item
表并表示需要先声明它。此时我不知道为什么会发生这种情况以及如何解决它。另外,我对该查询的性能表示怀疑,因为我要对大约 30,000 件商品执行库存计算。
也许这个问题有一个简单的解决办法,或者也许有人可以想出一种完全不同的方法来计算这个该死的东西。无论如何,我可以使用我能得到的任何帮助。
亲切的问候。
最佳答案
对于所有项目,请尝试以下操作:
With Ints(aInt) As
(Select -365 Union All
Select aInt + 1 From Ints
Where aInt < 0)
Select item,
DateAdd(day, i.aInt, getdate()) tdate
Sum(quantity) runningTotal
from item_table it join Ints i
on it.[Date] < DateAdd(day, i.aInt, getdate())
group by item, DateAdd(day, i.aInt, getdate())
Option (MaxRecursion 1000)
要将其限制为一小部分项目,只需添加一个 where 子句
With Ints(aInt) As
(Select -365 Union All
Select aInt + 1 From Ints
Where aInt < 0)
Select item,
DateAdd(day, i.aInt, getdate()) tdate
Sum(quantity) runningTotal
from item_table it join Ints i
on it.[Date] < DateAdd(day, i.aInt, getdate())
where item in ([set of comma-delimited item values here])
group by item, DateAdd(day, i.aInt, getdate())
Option (MaxRecursion 1000)
关于SQL使用while循环计算多个元素的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42025762/