sql运行总计

Posted

技术标签:

【中文标题】sql运行总计【英文标题】:sql running totals 【发布时间】:2017-09-18 11:27:45 【问题描述】:

我有一张表格,上面列出了在某个截止日期之前要出售的物品和数量。 我正在尝试计算一个运行总列,该列将显示在某个特定时间会售出多少件商品。下面是我尝试获取运行总数的尝试,但它没有按我预期的那样工作。

select item, due_date, qty, sum(qty) over (Order by item )
from apsplan 
Where item ='19-3102875'
order by item

我得到错误:

消息 102,级别 15,状态 1,第 44 行 'order' 附近的语法不正确。

ps 我使用的是 SQL Server 2012。

这是我从这里收到的替代建议

SELECT
    item,
    due_date,
    qty,
    (SELECT SUM(t2.qty) FROM apsplan t2 WHERE t2.item <= t1.item and item = '196-31020-005') AS rolling_qty
FROM apsplan t1
WHERE
    item = '196-31020-005'
ORDER BY
    item

这是结果 - 不是总和,而是结束

item    due_date    qty rolling_qty
196-31020-005   2017-09-20 00:59:00.000 1.00000000  24.00000000
196-31020-005   2017-10-06 01:00:00.000 1.00000000  24.00000000
196-31020-005   2017-11-06 01:00:00.000 1.00000000  24.00000000
196-31020-005   2017-12-06 01:00:00.000 1.00000000  24.00000000
196-31020-005   2019-01-28 01:00:00.000 1.00000000  24.00000000
196-31020-005   2019-02-04 01:00:00.000 1.00000000  24.00000000
196-31020-005   2019-03-25 01:00:00.000 1.00000000  24.00000000
196-31020-005   2019-03-25 01:00:00.000 1.00000000  24.00000000
196-31020-005   2019-04-01 01:00:00.000 1.00000000  24.00000000
196-31020-005   2019-04-08 01:00:00.000 1.00000000  24.00000000
196-31020-005   2019-04-29 01:00:00.000 1.00000000  24.00000000
196-31020-005   2019-05-06 01:00:00.000 1.00000000  24.00000000
196-31020-005   2019-05-13 01:00:00.000 1.00000000  24.00000000
196-31020-005   2019-05-27 01:00:00.000 1.00000000  24.00000000
196-31020-005   2019-06-03 01:00:00.000 1.00000000  24.00000000
196-31020-005   2019-06-10 01:00:00.000 1.00000000  24.00000000
196-31020-005   2019-07-01 01:00:00.000 1.00000000  24.00000000
196-31020-005   2019-07-08 01:00:00.000 1.00000000  24.00000000
196-31020-005   2019-07-15 01:00:00.000 1.00000000  24.00000000
196-31020-005   2019-07-29 01:00:00.000 1.00000000  24.00000000
196-31020-005   2019-08-05 01:00:00.000 1.00000000  24.00000000
196-31020-005   2019-08-12 01:00:00.000 1.00000000  24.00000000
196-31020-005   2019-08-26 01:00:00.000 1.00000000  24.00000000
196-31020-005   2019-09-02 01:00:00.000 1.00000000  24.00000000

【问题讨论】:

问题中的查询看起来不错。我没有看到任何语法错误。您是在显示您尝试运行的实际查询,还是一些缩减版本? 我同意弗拉基米尔的观点,执行得很好。由于它声明第 44 行,我怀疑这是更大查询的一部分,问题出在其他地方 @SEarle1986 这就是代码。我上面唯一的东西是在我来这里之前我正在玩的同一个查询的变体.....我已经注释掉了所有这些,这样将运行的唯一行就是我在这里发布的行 @user2355773 您确定错误与此代码有关吗?它报告第 44 行,您的代码行数较少。第二个奇怪的事情是它在 'order' 附近报告不正确的语法。请注意,它是小写的,但您在 over (Order by item ) 中的 Order 是大写。我试图引发类似的错误,如果我把它写成大写,Order 这个词会被报告为大写,所以也许这不是你正在考虑的一行? @user2355773 请用 SELECT @@version 的结果更新您的问题 【参考方案1】:

评论太长了。

即使您使用的是 SQL Server 2012,实际功能也取决于兼容性级别。您可以使用以下方式查询兼容性级别:

SELECT name, compatibility_level FROM sys.databases

这应该至少为 110,以便您使用 order bysum()。要更改兼容性,请参阅documentation。如果您的兼容性较旧(可能需要少于 100 个),那么您可能会收到此错误。

【讨论】:

其实这不是真的。至少,对于 SQL Server 2014 Express。 SUM(...) OVER (ORDER BY ...) 在我的测试中使用了兼容级别 100 的用户数据库。

以上是关于sql运行总计的主要内容,如果未能解决你的问题,请参考以下文章

sql运行总计

SQL 查询重新计算运行总计

SQL Server 2012 Windowing 函数计算运行总计

在 SQL Server 中计算运行总计

按组 SQL 运行总计 (Oracle)

从运行总计 (SQL) 雪花中排除某些记录