#sql #tsql
#sql #tsql
Вопрос:
declare @totalBillable decimal(18, 4)
declare @qaTotalMinutes decimal(18, 4)
declare @devTotalMinutes decimal(18, 4)
select * from JobEntry je
where JobId = 1111
Таким образом, этот выбор вернет все записи ввода задания для этого конкретного задания.
Мне нужно рассчитать оплачиваемое время для каждой записи задания и увеличить определенное значение на основе имени записи задания.
Что-то вроде:
if je.Name = 'Development'
set @devTotalMinutes = @devTotalMinutes dbo.GetBillableTimeMinutesForEntry(je.StartTime, je.EndTime)
if je.Name = 'QA'
set @qaTotalMinutes = @qaTotalMinutes dbo.GetBillableTimeMinutesForEntry(je.StartTime, je.EndTime)
и так далее.
Мне нужно вызвать функцию getbillablet timeminutesforentry для каждой записи, чтобы вычислить оплачиваемое время между временем начала и окончания записи. Затем мне нужно увеличить одну из общих переменных на основе имени записи задания. И повторите для каждой строки.
Я знаю, что мог бы использовать курсоры для итеративного подхода, но я хочу спросить, есть ли лучший способ сделать все это в t-sql.
Комментарии:
1. Пожалуйста, предоставьте примеры данных и желаемые результаты в виде текстовых таблиц в вопросе.
Ответ №1:
Вы можете использовать оконные функции для условной суммы:
select je.*,
sum(case when je.Name = 'Development'
then dbo.GetBillableTimeMinutesForEntry( je.StartTime, je.EndTime)
else 0
end) over (partition by jobid order by je.StartTime) as development_minutes,
sum(case when je.Name = 'QA'
then dbo.GetBillableTimeMinutesForEntry( je.StartTime, je.EndTime)
else 0
end) over (partition by jobid order by je.StartTime) as qa_minutes
from jobEnty je