Я хочу динамически вычислять значения таблицы и находить минимальную и максимальную цель по параметру
У меня есть следующая целевая таблица с данными:
Name Quarter Method MethodID GivenTarget Percentage
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
Я передаю параметр AchievedTarget
для определенного квартала (1, 2, 3, 4).
ЕСЛИ квартал = 1 и AchievedTarget = 250000, мне нужна запись, где AchievedTarget находится между ними
Вывод должен быть таким:
ЕСЛИ квартал = 1 и AchievedTarget = 400000, мне нужна запись, где AchievedTarget находится между
Вывод должен быть таким:
ЕСЛИ квартал = 2 и достигнутая цель = 400000, я хочу суммировать столбец GivenTarget
из целевых таблиц, где квартал = 1, метод = «AB», Method_ID = 1
С Quarter= 2 Method = 'AB' Method_ID = 1 и так далее для добавления каждого соответствующего метода и Method_ID с кварталами, и необходимо выбрать процентные значения из текущего квартала, т.е. квартал 2 в этом случае с соответствующими Method и Method_ID
Ожидаемые новые целевые таблицы на 2-й квартал должны быть следующими:
Теперь в зависимости от приведенной выше таблицы я хочу рассчитать Min_Target и Max_Target, как было рассчитано ранее.
Ожидаемый результат с Quarter= 2 и AchievedTarget= 500000 должен быть:
Ниже приведен код, который я пытался, он дает мне вывод только для Quarter = 1
--DECLARE Input Parameters
DECLARE @AchievedTarget Money =200000
DECLARE @Name varchar(30)='Json Ray' , @Quarter int =1, @Mothod varchar(10)='AB'
--DECLARE Ouput variable
DECLARE @Min_Target Money, @Max_Target Money, @Min_Percenatge float ,@Max_Percenatge float
--Finding Min_Target
SET @Min_Target=(SELECT TOP 1 [GivenTarget] as Min_Target
FROM [Target]
WHERE [Name] = @Name
AND Quarter = @Quarter
AND Mothod =@Mothod
and [GivenTarget] < @AchievedTarget
order by [GivenTarget] desc)
IF @Min_Target IS Null
SET @Min_Target=(@AchievedTarget)
--Finding Max_Target
SET @Min_Target=(SELECT TOP 1 [GivenTarget] as Min_Target
FROM [Target ]
WHERE [Name] = @Name
AND Quarter = @Quarter
AND Mothod =@Mothod
and [GivenTarget] < @AchievedTarget
order by [GivenTarget] ASC)
IF @Max_Target IS Null
SET @Max_Target=(@AchievedTarget)
--Finding @Min_Percenatge
SET @Min_Percenatge=(SELECT TOP 1 [Percenatge] AS Min_Percenatge
from [Target ]
WHERE [Name] = @Name
AND Quarter = @Quarter
AND Mothod =@Mothod
AND [GivenTarget] in (@Min_Target,@Max_Target))
--Finding @Max_Percenatge
SET @Max_Percenatge=(SELECT TOP 1 [Percenatge] AS Max_Percenatge
from [Target ]
WHERE [Name] = @Name
AND Quarter = @Quarter
AND Mothod =@Mothod
AND [GivenTarget] in (@Min_Target,@Max_Target)
ORDER BY [Percenatge] DESC)
--Display Ouput
SELECT @Name, @Quarter,@Mothod ,@Min_Target, @Max_Target, @Min_Percenatge,@Max_Percenatge
Я не могу динамически вычислять значения таблицы и находить минимальную и максимальную цель из параметра квартала.
Привет, TomC, ниже приведены данные исходной таблицы в тексте Имя Квартал Метод ID GivenTarget Percentage 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 BC 2 408000 2.3 Json Ray 3 CD 3 6 0 Json 4 Ray 0 3 552000 2.3 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
CREATE TABLE [dbo].[Target]( [Name] [nvarchar](255) NULL, [Quarter] [float] NULL, [Method] [nvarchar](255) NULL, [MethodID] [float] NULL, [GivenTarget ] [float] NULL, [Percentage] [float] NULL ) ON [PRIMARY] Спасибо
Спасибо @sparta_saggy, я отредактировал вопрос, чтобы показать, куда должны идти ваши данные. Вы всегда можете отредактировать свои вопросы, чтобы добавить дополнительную информацию.
Согласно вашим тестовым данным, у вас есть только одна запись на каждый моход за квартал. Таким образом, вы будете смотреть только на одну строку.
Вы должны иметь возможность просто использовать предложение WHERE в подзапросе, который вычисляет минимум и максимум. Что-то вроде этого:
declare @quarter int = 2;
declare @achieved_target money = 300000.00;
SELECT *
FROM (select name, min(achieved_target) as min_target, max(achieved_target) as max_target FROM table WHERE quarter = @quarter GROUP BY name) as t1
WHERE @achieved_target BETWEEN min_target and max_target;
Я собрал набор образцов данных и запрос, который сделает это. Я удалил ссылки на 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, чтобы получить совокупные итоги за квартал, и второй 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 и @achieved=500000:
Name Qtr MinTarget MaxTarget MinPct MaxPct
Json Ray 2 376000 516000 1.40 1.80
Над этим вопросом было бы намного проще работать, если бы нам не нужно было вводить исходные данные из изображения. Пожалуйста, вставляйте данные в текстовом формате, а не в изображении.