【问题标题】:Resetting a rolling sum重置滚动总和
【发布时间】:2019-02-13 23:20:37
【问题描述】:

我正在尝试根据数量创建机车车辆计数。每次有实际库存计数(TypeOfMovement = 3)时,计数都应重置。这应该适用于每个 ArticleNo 并按日期分组。

我可以获得一个正在运行的库存计数(图像中

解决方案应在 SSMS 中运行。或者,可以运行 python 解决方案。

到目前为止我的查询是:

WITH a
AS
(SELECT
        DateOfMovement, Quantity, ArticleNo, TypeOfChange,
        CASE 
        WHEN TypeOfChange = 3 Then 0
        ELSE Quantity
        END AS RunningTotal
    FROM Stock_Table
    Group by DateOfMovement, Quantity, ArticleNo, TypeOfChange)
SELECT
    *
    ,CASE
        WHEN TypeOfChange= 3 THEN Quantity   
        ELSE Sum(Quantity) OVER(ORDER BY ArticleNo, DateOfMovement)
    END AS ResetRunningTotal
FROM a
WHEre ArticleNo = 9410
group by DateOfMovement, ArticleNo, Quantity, TypeOfChange, RunningTotal
order by DateOfMovement asc

结果表的图像是..

【问题讨论】:

  • 您使用的是GROUP BY,没有任何聚合功能。所以RunningTotal 的值来自组中的随机行。
  • 我可能应该清理掉那个部分,因为我创建的 RunningTotal 专栏现在对我没有任何帮助 - 因为我一直在尝试不同的东西,所以这部分有点混乱。如果重置滚动总和(例如在第 123 行之后),ResetRunningTotal 接近我想要的值
  • 什么数据库?不同的 DBMS 引擎以不同的方式实现 SQL 语言的各个部分,尤其是在聚合和分析函数方面。
  • 它在 SSMS 中,将使用 T-SQL
  • SSMS 基本上是无关紧要的,它只是一个查询工具。

标签: python sql sql-server tsql count


【解决方案1】:

好的,因此您希望运行由DateOfMovement 排序的每个ArticleNo 的总数,当您遇到TypeOfChange 值为 3 时会重置。

为此,您需要为每个运行总计创建一个 grouping_id (Grp)。您可以使用计算组 ID 的 CTE 执行此操作,然后使用 CTE 结果计算运行总计:

with Groups as (
select st.*
     , sum(case TypeOfChange when 3 then 1 else 0 end)
       over (partition by ArticleNo order by DateOfMovement) Grp
  from Stock_Table st
)
select Groups.*
     , sum(Quantity) over (partition by ArticleNo, Grp order by DateOfMovement) RunningTotal
  from Groups
 order by ArticleNo, dateofmovement

【讨论】:

    猜你喜欢
    • 2013-08-13
    • 1970-01-01
    • 1970-01-01
    • 2020-11-23
    • 2015-07-21
    • 2019-04-11
    • 2021-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多