UnitDen Asked:2020-10-14 20:17:50 +0000 UTC2020-10-14 20:17:50 +0000 UTC 2020-10-14 20:17:50 +0000 UTC 我如何在sql中计算封闭季度 772 这里有张桌子。需要计算关闭季度所有员工的总和(工资),如果该季度尚未完成,则显示上一个关闭季度的总和,如果上一季度未完成,则显示 0 sql 1 个回答 Voted Best Answer Andrei Odegov 2020-10-15T13:38:18Z2020-10-15T13:38:18Z 如果 SQL Server 的版本是 2012 或更高版本,则可以使用LAG功能。 select s.[date], s.fio, s.salary, datepart(quarter, s.[date]) quarter_nbr, j1.quarter_salary from salaries s join ( select a2.prev_quarter, a1.cur_quarter, a2.next_quarter, case count(distinct a1.cur_month) when 3 then sum(s.salary) else case when lag( count(distinct a1.cur_month) ) over(order by a1.cur_quarter) = 3 and lag( a1.cur_quarter ) over(order by a1.cur_quarter) = a2.prev_quarter then lag(sum(s.salary)) over(order by a1.cur_quarter) else 0 end end quarter_salary from salaries s cross apply ( select dateadd(quarter, datediff(quarter, 0, [date]), 0) cur_quarter, dateadd(month, datediff(month, 0, [date]), 0) cur_month ) a1 cross apply( select dateadd(quarter, -1, cur_quarter) prev_quarter, dateadd(quarter, 1, cur_quarter) next_quarter ) a2 group by a2.prev_quarter, a1.cur_quarter, a2.next_quarter ) j1 on s.[date] >= j1.cur_quarter and s.[date] < j1.next_quarter; 结论: +------------+---------+--------+-------------+----------------+ | date | fio | salary | quarter_nbr | quarter_salary | +------------+---------+--------+-------------+----------------+ | 2018-12-31 | Сидоров | 2000 | 4 | 4400 | | 2018-11-28 | Иванов | 1200 | 4 | 4400 | | 2018-10-31 | Иванов | 1200 | 4 | 4400 | | 2019-06-30 | Иванов | 1200 | 2 | 0 | | 2019-09-30 | Сидоров | 1400 | 3 | 9600 | | 2019-09-16 | Иванов | 1800 | 3 | 9600 | | 2019-08-31 | Сидоров | 2000 | 3 | 9600 | | 2019-08-31 | Иванов | 1200 | 3 | 9600 | | 2019-07-31 | Сидоров | 2000 | 3 | 9600 | | 2019-07-31 | Иванов | 1200 | 3 | 9600 | | 2019-10-14 | Сидоров | 2900 | 4 | 9600 | | 2019-10-14 | Иванов | 1800 | 4 | 9600 | +------------+---------+--------+-------------+----------------+ SQL Fiddle上的演示。
如果 SQL Server 的版本是 2012 或更高版本,则可以使用LAG功能。
结论:
SQL Fiddle上的演示。