Я собрал набор примеров данных и запросов, которые сделают это.Я удалил ссылки на Mothod, поскольку у вас есть только 1 строка на Mothod за квартал.Вы можете добавить столбец обратно в мое решение, если у вас больше строк, чем в вашем образце.
Сначала настройте таблицу и проверьте данные
declare @comm table(Name varchar(20), Qtr int, Mothod varchar(2), Method_ID int, GivenTarget int, Pct decimal(5,2))
insert @comm values
('Json Ray',1,'AB',1,153000,0.2 )
,('Json Ray',1,'BC',2,208000,0.5 )
,('Json Ray',1,'CD',3,252000,0.8 )
,('Json Ray',1,'DE',4,450000,0.2 )
,('Json Ray',2,'AB',1,223000,1.4 )
,('Json Ray',2,'BC',2,308000,1.8 )
,('Json Ray',2,'CD',3,352000,1.2 )
,('Json Ray',2,'DE',4,550000,1.5 )
,('Json Ray',3,'AB',1,323000,2.8 )
,('Json Ray',3,'BC',2,408000,2.3 )
,('Json Ray',3,'CD',3,552000,2.4 )
,('Json Ray',3,'DE',4,650000,2.9 )
,('Json Ray',4,'AB',1,423000,2.2 )
,('Json Ray',4,'BC',2,508000,3.3 )
,('Json Ray',4,'CD',3,652000,3.5 )
,('Json Ray',4,'DE',4,750000,3.9 )
Добавьте верхнюю строку в случае в качествепоймать для тех, кто достиг выше вашей верхней цели
insert @comm
select Name, qtr, null, null, 999999, max(pct) from @comm group by Name, qtr
Настройте свои условия.Я убрал Mothod, так как у вас есть только одна строка на Mothos на Qtr
DECLARE @AchievedTarget Money
DECLARE @Name varchar(30), @Quarter int
select @AchievedTarget=500000, @Name='Json Ray' , @Quarter=2
Используйте CTE для получения совокупных итогов на qtr и второй CTE, чтобы сгладить каждую строку, чтобы он также имел значенияпредыдущий рядЯ использовал row_number, чтобы убедиться, что я правильно упорядочил ваши строки, даже несмотря на то, что в вашей дате выборки mothod_id, по-видимому, также содержит те же данные.
Последний запрос затем просто находит правильную строку из CTE.
;with c as (
select Name, upto as qtr, Mothod, Method_ID,
sum(GivenTarget) as GivenTarget,
max(case when c.qtr=q.upto then c.pct else 0 end) as Pct,
row_number() over (partition by Name, upto order by sum(GivenTarget)) as rn
from @comm c
join (select distinct qtr as upto from @comm) q on c.qtr<=upto
group by Name, upto, Mothod, Method_ID
)
, c2 as (
select c.Name, c.Qtr, c.GivenTarget as MaxTarget, c.Pct as MaxPct,
isnull(c2.GivenTarget,0) as MinTarget, isnull(c2.Pct,0) as MinPct
from c
left join c c2 on c2.name=c.name and c2.qtr=c.qtr and c2.rn=c.rn-1
where c.name=@name and c.qtr=@Quarter
)
select Name, Qtr, MinTarget, MaxTarget, MinPct, MaxPct
from c2
where @AchievedTarget>MinTarget and @AchievedTarget<=MaxTarget
Результат, используя @ qtr = 2 и @ достигаемый = 500000:
Name Qtr MinTarget MaxTarget MinPct MaxPct
Json Ray 2 376000 516000 1.40 1.80