Я думаю, вы просто хотите объединить все:
with ot as (
select orderyear, TimeFrame, min(fiscaldate) as minimumdate,
max(fiscaldate) as maximumdate, sum(fiscalrevenue) as revenue
from mytable
group by orderyear, TimeFrame
)
select ot.*
from ot
union all
select ot.orderyear, 'ABC', ot.minimumdate, ot.maximumdate, ot.revenue
from ot
where ot.orderyear = year(getdate()) and ot.TimeFrame = 'YTD' and
not exists (select 1
from ot ot2
where ot2.ot.orderyear = year(getdate()) and ot.TimeFrame = 'ABC'
)
order by 1, 2;
РЕДАКТИРОВАТЬ:
Если вы хотите это с одной ссылкой на базовую таблицу, я бы предложил:
select orderyear, timeframe, minimumdate, maximumdate, revenue
from (select orderyear, TimeFrame, min(fiscaldate) as minimumdate,
max(fiscaldate) as maximumdate, sum(fiscalrevenue) as revenue,
max(orderyear) over () as max_year,
max(case when TimeFrame = 'ABC' then orderyear end) over () as max_abc_year
from mytable
group by orderyear, TimeFrame
) t cross apply
(values (1, orderyear, timeframe, minimumdate, maximumdate, revenue),
(2, orderyear, 'ABC', minimumdate, maximumdate, revenue)
) v(which, orderyear, timeframe, minimumdate, maximumdate, revenue)
where which = 1 or
(orderyear = max_year) and max_abc_year < max_abc_year);
Запускает запрос и использует cross apply
для дублирования строк.Он выбирает дублированную строку только для максимального года, когда для этого года нет записи "ABC".