[英]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.