Обычно я делаю это в виде отдельных столбцов:
select avg(error) as total,
avg(case when timestamp > cast(getdate() as date) then error end) as today,
avg(case when timestamp > dateadd(day, -6, cast(getdate() as date) then error end) as this_week,
. . .
from t;
Я не уверен, каковы ваши точные определения для «сегодня», «на этой неделе» и так далее.Выше приведен пример условной агрегации.
Это происходит через t
только один раз.
Если вы хотите сделать это в отдельных строках, вы можете отменить вывод данных.Мой предпочтительный метод использует cross apply
:
with t as (
select avg(error) as total,
avg(case when timestamp > cast(getdate() as date) then error end) as today,
avg(case when timestamp > dateadd(day, -6, cast(getdate() as date) then error end) as this_week,
. . .
from t
)
select v.*
from t cross apply
(values ('Total', total), ('Today', today), ('This week', this_week), . . .
) v(period, error);