SQL使用while循环计算多个元素的值

标签 sql sql-server-2008 ssms

我正在尝试使用 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/

相关文章:

sql - 子查询不能出现在 Insert Values 语句中

sql - 具有连续日期范围记录的数据集中的最小和最大日期的日期范围

c# - 在 C# LINQ 中使用 SQL LIKE 运算符

sql-server-2008 - 使用临时表和选择语句的 SQL 2008 上的 NOLOCK 问题

sql-server - 需要 Sql server 2008 代码片段或模板建议

.net - 使用 Visual Studio 解决方案集成或链接到 SQL Server Management Studio 项目

MySQL JOIN 复杂性

sql - 如何在合并条件 "Or"中使用 "WHEN NOT MATCHED BY Source"

sql-server - 将小数时间转换为小时和分钟

sql-server - SSIS - RPC 服务器不可用