Примените функцию к каждой строке в SQL server и выполните дополнительные условия для этой строки

#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