Вернуть значение YTD, если ничего для ABC - PullRequest
1 голос
/ 26 сентября 2019

Записи для timeframe для поля orderyear 2019 не принесут ABC, пока мы не получим первую запись за этот год, начиная с января следующего года (2020).В качестве обходного пути я не хочу уходить без всякой ценности.Есть ли в любом случае, пока мы не начнем видеть, что цифры для ABC проходят через orderyear 2019, я хочу, чтобы числа YTD отображались вместо замены значения YTD на ABC.Я использую SSMS 2016. Может ли кто-нибудь оказать помощь.

Мой запрос:

select 
  orderyear, TimeFrame, min(fiscaldate) minimumdate,
  max(fiscaldate) maximumdate, sum(fiscalrevenue) revenue 
from mytable
group by orderyear, TimeFrame
order by 1 


orderyear   timeframe      minimumdate    maximumdate   revenue
2017         ABC           2018-01-01      2018-04-30   1056.38
2017         YTD           2017-01-04      2017-09-28   159.54
2018         ABC           2019-01-01      2019-04-30   1026.10
2018         YTD           2018-04-24      2018-09-27   2461.11
2019         YTD           2019-04-25      2019-09-25   3494.06

Запрошено:

orderyear   timeframe      minimumdate    maximumdate   revenue
2017         ABC           2018-01-01      2018-04-30   1056.38
2017         YTD           2017-01-04      2017-09-28   159.54
2018         ABC           2019-01-01      2019-04-30   1026.10
2018         YTD           2018-04-24      2018-09-27   2461.11
2019         YTD           2019-04-25      2019-09-25   3494.06
**2019       ABC           2019-04-25      2019-09-25   3494.06**

Ответы [ 2 ]

2 голосов
/ 26 сентября 2019

Я думаю, вы просто хотите объединить все:

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".

1 голос
/ 26 сентября 2019

С помощью оконной функции вы можете определить, какие годовые записи не имеют «abc».Затем вы можете удвоить эти рекорды.Затем продолжайте как обычно:

select      orderyear,
            ap.TimeFrame,
            minimumDate = min(minimumDate),
            maximumDate = max(maximumDate),
            sum(revenue) revenue
from        (
                select  *, 
                        hasABC = 
                            max(iif(timeFrame = 'abc', 1, 0)) 
                            over (partition by orderYear)
                from    mytable
            ) t 
cross apply (
                select timeframe union all
                select 'ABC' where t.hasABC = 0
            ) ap
group by    orderyear, 
            ap.TimeFrame
order by    orderYear, timeframe
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...