【问题标题】:SQL Running Total reset after x amountSQL Running Total 在 x 数量后重置
【发布时间】:2014-01-16 23:49:16
【问题描述】:

我正在查询一个人在一年中拼车的次数,按季度细分。该人每拼车20次,就有资格获得报酬。拼车数量全年持续增加,但每季度仅支付一次。

我有这样的数据:

+-------+-----+--------+----+
|quarter|value|RunTotal|Paid|
+-------+-----+--------+----+
|Jan-Mar|19.0 |19.0    |0.00|
+-------+-----+--------+----+
|Apr-Jun|2.0  |21.0    |1.00|
+-------+-----+--------+----+
|Jul-Sep|0.0  |21.0    |0.00|
+-------+-----+--------+----+
|Oct-Dec|0.0  |21.0    |0.00|
+-------+-----+--------+----+

如图所示,他们在第一季度没有收到支票。然而,他们在第二场比赛中做到了。我可以计算出运行总罚款。但是,我需要在“已付”列中做一个累计,减去任何以前的支出。请看一下并给我一些帮助。

DECLARE @SalesTbl TABLE (quarter varchar(250), value decimal(18,1), RunningTotal decimal(18,1), earned money)
DECLARE @RunningTotal decimal(18,1), @earned money
SET @RunningTotal = 0
SET @earned = 0

INSERT INTO @SalesTbl 
    SELECT CASE DatePart(q, c.date) 
    WHEN 1 THEN 'Jan-Mar' 
    WHEN 2 THEN 'Apr-Jun' 
    WHEN 3 THEN 'Jul-Sep' 
    WHEN 4 THEN 'Oct-Dec' END AS quarter,
    IsNULL(Sum(t.value),0) AS value,
    null,
    0
FROM @calendar c
LEFT OUTER JOIN events e ON (DatePart(q, c.date) = DatePart(q, e.eventDate) AND e.employeeID = @employeeID AND e.eventType = 'CP' AND Year(eventDate) = @year)
LEFT JOIN types t ON t.typeID = e.eventType
GROUP BY DatePart(q, c.date)

UPDATE @SalesTbl 
SET @RunningTotal = RunningTotal = @RunningTotal + value, @earned = earned = Floor(@RunningTotal/20) - (SELECT Sum(earned) FROM @SalesTbl)

FROM @SalesTbl

SELECT * FROM @SalesTbl

【问题讨论】:

  • 您使用的是什么 SQL 引擎?看起来像 SQL server,但是什么版本?

标签: sql sql-server cumulative-sum


【解决方案1】:

听起来你应该使用 SQL 窗口

请参阅以下页面以获取示例: http://technet.microsoft.com/en-us/library/ms189461.aspx

您应该按季度 (DatePart(q, c.date)) 和 SUM(t.value) 进行分区。 SUM(SUM(t.value)) OVER(PARTITION BY DatePart(q, c.date)) AS 'Total'

【讨论】:

    猜你喜欢
    • 2022-11-23
    • 2018-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-25
    • 2014-09-07
    • 2018-02-17
    相关资源
    最近更新 更多