【问题标题】:Create a running subtotal for SQL Server为 SQL Server 创建运行小计
【发布时间】:2013-01-22 20:35:42
【问题描述】:

我正在尝试获取一个正在运行的小计(了解这与组的小计以及汇总方法不同)。

尝试使用

Row_Number() over (order by ID_Number) as Row_Count 

并将其嵌套在 select 语句中,并在其自身上使用 LEFT OUTER JOIN(这只是搅动)。

我想要得到的是:

if ROW_COUNT > 1 THEN RUNNINGTOTAL = Volume_Category + (RUNNINGTOTAL for ID_Number where ROW_COUNT= ROW_COUNT(for this ID_Number*)-1)

我有一个表格,其中列出了唯一的“ID 号”,这是这里的重点。

【问题讨论】:

  • 能否提供简单的数据和结果?
  • 你用的是什么版本的sql server?
  • 关于这个有几个问题,通常标记为累积和。我喜欢带有临时变量的答案,例如:stackoverflow.com/a/7631964/931379。它们通常比巧妙地使用 sum 函数快得多。
  • @Pursuit 不保证以任何特定顺序处理古怪的更新(例如UPDATE SET @var = Total = @var + value),即使您观察到了这种顺序。请参阅sqlperformance.com/2012/07/t-sql-queries/running-totals 了解更多详情。
  • @pursuit 我在问自己之前搜索了答案。需要使用“累积”而不是“运行小计”

标签: sql sql-server


【解决方案1】:

除非您使用的是 SQL Server 2012,否则进行累积和的最简单方法是使用相关子查询。这是代码的模板:

select t.*,
       (select sum(val) from t t2 where t2.ordercol <= t.ordercol) as cumesum
from t

2012年,你可以做到:

select t.*,
       sum(val) over (order by ordercol) as cumesum
from t

在这两个中,val 是您要求和的列,ordercol 是指定顺序的方式。

【讨论】:

  • @bluefeet 。 . .大声笑,我想你以前提出过这个建议。我会学习吗?
  • 我不明白第二个查询是什么!
  • @HamletHakobyan 它适用于 SQL Server 2012!
  • @Lamak 你确定它返回累积和吗?任何人都可以举个关于 sql fiddle 的例子吗?伟大的解决方案!
  • Cursor 实际上在我对 ROWS UNBOUNDED PRECEDING - 默认情况下这将使用 RANGE,它自动假脱机到磁盘。 sqlperformance.com/2012/07/t-sql-queries/running-totals
【解决方案2】:

试试这个:

SELECT
   T1.Id,
   SUM(T2.Amount) Total
FROM tbl T1
   JOIN Tbl T2
      ON T1.Id>= T2.Id
GROUP BY T1.Id

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-14
    • 1970-01-01
    • 2010-10-26
    • 1970-01-01
    • 1970-01-01
    • 2019-09-30
    相关资源
    最近更新 更多