繁体   English   中英

从以前的值中减去值,但有异常

[英]Subtract value from previous value with exception

我有一些计算,正常的 LAG 函数可以为我解决这个问题,我试过了。 然而。 我的问题有一个例外。 每年 1 月和 7 月,该值都会重置为 1500。在第 2 行,我需要减去第 1 行的值(这是 LAG 出现的地方)。 这有效,但我不知道如何解决它,7 月和 1 月除外。 看图

在此处输入图片说明

我使用过的代码

SELECT 
SUM(ts.[HOURS]) as HOURS
,FORMAT(ts.STARTDATE, 'yyyyMM') as YearMonth
,YEAR(ts.STARTDATE) as Year
,MONTH(ts.STARTDATE) as Month
,LAG(SUM(ts.[HOURS])) OVER(ORDER BY FORMAT(ts.STARTDATE, 'yyyyMM') ) as lag
--,IIF(MONTH(ts.STARTDATE) = 1 OR MONTH(ts.STARTDATE) = 7, 1500 - SUM(ts.[HOURS]), SUM(ts.HOURS)) as tidkvar
,LEAD(SUM(ts.[HOURS])) OVER(ORDER BY FORMAT(ts.STARTDATE, 'yyyyMM') ) as lead
FROM [dbo].[TimesheetLines] AS ts
WHERE ts.PROJECTID = '70000196.01.02' OR ts.PROJECTID = '70000196.02.02' OR ts.PROJECTID = '70000013.02'
GROUP BY FORMAT(ts.STARTDATE, 'yyyyMM'), YEAR(ts.STARTDATE), MONTH(ts.STARTDATE)
Order by YearMonth

在下面的答案之后我试过了

SELECT
--SUM(ts.HOURS)
FORMAT(ts.STARTDATE, 'yyyyMM') YearMonth
,1500 - sum(ts.HOURS) over (partition by year(ts.STARTDATE), (month(ts.STARTDATE) - 1) / 6 order by ts.STARTDATE) as TimmarKvar
FROM FactTSTimesheetLines_UNPIVOT as ts
WHERE ts.PROJECTID IN ('70000196.01.02','70000196.02.02','70000013.02')
GROUP BY FORMAT(ts.STARTDATE, 'yyyyMM'), ts.STARTDATE, ts.HOURS
Order by YearMonth 

但我收到错误消息,指出 HOURS 不在聚合函数中,也不在 GROUP BY 中。 我将 HOURS 添加到 GROUP BY 但这显然给了我每小时的行数,这是不希望的

假设你有一个日期,你可以使用累积和和减法。 但是您需要将数据分组。 一种简单的方法是使用month()year()

select t.*,
       (1500 -
        sum(col1) over (partition by year(datecol), (month(datecol) - 1) / 6 order by datecol)
       )
from t;

我使用了可以在键盘上拼写的列名称。

是一个 db<>fiddle。

我将月份分组,并使用 CTE 对每组进行求和。 虽然戈登的回答要简单得多。 如:

CREATE TABLE #Work (StartDate date, HOURS int)
INSERT INTO #Work
    VALUES ('1/1/2019', 132),
            ('2/1/2019',258),
            ('3/1/2019',201),
            ('4/1/2019',181),
            ('5/1/2019',85),
            ('6/1/2019',186),
            ('7/1/2019',6),
            ('8/1/2019',156),
            ('9/1/2019',240),
            ('10/1/2019',419),
            ('11/1/2019',335),
            ('12/1/2019',109),
            ('1/1/2020',179),
            ('2/1/2020',228),
            ('3/1/2020',97)

;WITH CTE AS
(
    SELECT 
    SUM(ts.[HOURS]) as HOURS
    ,FORMAT(ts.STARTDATE, 'yyyyMM') as YearMonth
    ,YEAR(ts.STARTDATE) as Year
    ,MONTH(ts.STARTDATE) as Month
    ,SUM(CASE WHEN MONTH(ts.STARTDATE) IN (1,7) THEN 1 ELSE 0 END) OVER(ORDER BY YEAR(ts.STARTDATE), MONTH(ts.STARTDATE)) GRP
    FROM #Work AS ts
    GROUP BY FORMAT(ts.STARTDATE, 'yyyyMM'), YEAR(ts.STARTDATE), MONTH(ts.STARTDATE), ts.HOURS
)
SELECT * ,
1500 -  SUM(HOURS) OVER(PARTITION BY GRP ORDER BY MONTH) Total
from CTE
Order by YearMonth

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM