#sql #sql-server
#sql #sql-сервер
Вопрос:
Как получить текущий итог в SSMS?
select E.Employee,E.Month,E.Year,E.Salary,
SUM(E.Salary) over (partition by E.Year order by E.Employee) as Cum_Sal
from Employees E
group by E.Employee,E.Month,E.Year,E.Salary
order by E.Year
Требуется вывод:
Комментарии:
1. Почему это помечено tcl?
Ответ №1:
Попробуйте это:
select E.Employee
,E.Month
,E.Year
,E.Salary
,SUM(E.Salary) OVER
(
partition by E.Year
order by CASE E.Month
WHEN 'Jan' THEN 1
WHEN 'Feb' THEN 2
WHEN 'Mar' THEN 3
WHEN 'Apr' THEN 4
WHEN 'May' THEN 5
WHEN 'Jun' THEN 6
WHEN 'Jul' THEN 7
WHEN 'Aug' THEN 8
WHEN 'Sep' THEN 9
WHEN 'Oct' THEN 10
WHEN 'Nov' THEN 11
WHEN 'Dec' THEN 12
END
) as Cum_Sal
from Employees E
order by E.Year
Ответ №2:
SQL Server имеет довольно гибкие методы преобразования в дату. И ваша основная проблема заключается в том, что строки не имеют удобного порядка — даты хранятся как названия месяцев.
Но вы можете легко преобразовать в дату и использовать ее для упорядочения:
select e.*, -- or whatever columns you want
sum(e.Salary) over (partition by e.employee, e.Year
order by convert(date, '2000 ' e.month)
) as cumulative_salary
from Employees e
order by e.employee, e.Year;
Для этого запроса агрегирование не требуется.
Другой удобный метод использует charindex()
:
sum(e.Salary) over (partition by e.employee, e.Year
order by charindex(month, 'jan,feb,mar,apr,may,jun,jul,aug,sep,oct,nov,dec')
) as cumulative_salary
Комментарии:
1. отличная помощь с запросом