SQL Server 2008 累计运行总计
Posted
技术标签:
【中文标题】SQL Server 2008 累计运行总计【英文标题】:SQL Server 2008 Cumulative Running Total 【发布时间】:2018-01-14 22:51:45 【问题描述】:我需要计算加班费的累计总额
difference 列计算 ContractedHours 和 Hours_delivered_in_period
之间的差异在上面的示例中,他们在第 2 期工作“-4”小时,在第 10 期加班“+1”小时。 这应该给出总的-3。然后在第 11 阶段,他们加班了“9.5”小时,但这应该会使他们恢复到积极的“+6.5”
一旦他们回到正小时数,那么它应该重置回 0,因为他们不应该累积正小时数,因为他们每个月都有报酬,因此他们不应该被“保留”,所以他们总是重置回 0。
然后它们可能在第 12 期有负差异,并且从第 11 期计算得出的正小时数不应计入总数,因此一旦小时数为正数,小时数应回到 0
如何在 SQL Server 2008 中计算此运行“负数”总数以跟踪不足时间?
编辑 - 更新
这是我想在 SQL 中完成的示例列,我已经在 excel 中完成了,我想知道如何在 SQL 中执行名为“他们是否超时”的列
Excel 公式是“=IF(OR(H2
我的 SQL 尝试如下,但是它没有添加差异,它保持在“-4”并且不添加下一个值。
SELECT T1.* ,
T2.RunningSum
FROM Staff_Tracked_Hours As T1
CROSS APPLY ( SELECT sum(differencefromzero) AS RunningSum
FROM dbo.Staff_Tracked_Hours AS CAT1
WHERE ( CAT1.Id <= T1.Id and CAT1.personID ='000033485' )
) AS T2
where t1.personID ='000033485'
【问题讨论】:
您需要一个 sql AFTER 触发器来更新相关列。 只保留几列(查询中使用的列),生成 INSERT 语句并提供预期结果 请将预期结果和实际结果发布为文本(不是图片)。如果有的话,也请尝试分享您的查询尝试 更新了更多细节 【参考方案1】:如果我对问题的理解正确,您要求得到 difference
列的总和,其中它是负数。在这种情况下,这个查询应该可以解决问题:
Select personID, SUM(difference)
From [table_name]
Where difference < 0
Group by personID
【讨论】:
只过滤负数周期,不考虑正数周期。 这就是我认为问题要问的,我的错。【参考方案2】:使用窗口函数:
with CTE as
(
select id, personid, year, period,
sum(differencefromzero) over (partition by personid order by year, period) as cumu_total
from MyTable
)
select id, personid, year, period,
case when cumu_total < 0 then cumu_total else 0 end as new_difference
from CTE
注意...这假设 differencefromzero 既是正数也是负数。
【讨论】:
我刚刚意识到,这并不能完全满足您的需要,因为它在运行总计之后进行归零,而不是在 differencefromzero 始终为负数,因为它仅跟踪负数小时数。如果它是正数,那么它总是 0。 @DavidHayward 我认为这可能最好作为一个过程而不是一个查询来处理......【参考方案3】:您可以使用 AFTER 或 INSTEAD OF 触发器,如下面的链接所示。
https://***.com/questions/5341584/sql-server-after-insert-trigger-update-another-column-in-the-same-table
【讨论】:
以上是关于SQL Server 2008 累计运行总计的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server 2012 Windowing 函数计算运行总计