Я хочу, чтобы динамически рассчитывать значения таблиц и найти минимальные и максимальные цели из параметра

У меня есть следующая таблица целей с данными:

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 и AchtainedTarget = 250000 Я хочу получить запись о том, где AchtainedTarget находится между

Вывод должен быть таким:

enter image description here

ЕСЛИ четверть = 1 и AchtainedTarget = 400000 Я хочу запись, где AchtainedTarget находится между

Вывод должен быть таким:

enter image description here

Если четверть = 2 и AchtainedTarget = 400000, я хочу суммировать столбец GivenTarget из таблиц назначения, где Quarter = 1, Method = 'AB', Method_ID = 1 При Quarter = 2 Method = 'AB' Method_ID = 1 и т. Д. Для добавления каждого соответствующего метода и Method_ID с кварталами, и необходимо выбрать процентные значения из текущего квартала, т.е. квартала 2 в этом случае с соответствующими Method и Method_ID

Ожидаемые новые целевые таблицы для второго квартала должны быть следующими:

enter image description here

Теперь зависит от приведенной выше таблицы. Я хочу рассчитать Min_Target и Max_Target, как рассчитано ранее.

Ожидаемый результат с Quarter = 2 и AchtainedTarget = 500000 должен быть:

enter image description here

Ниже приведен код, который я пытался, он дает мне вывод только для 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

Я не могу рассчитать значения таблицы динамически и найти минимальные и максимальные цели из параметра четверти.

1
Sparta_Saggy 28 Май 2019 в 06:16

2 ответа

Лучший ответ

Я собрал набор образцов данных и запросов, которые сделают это. Я удалил ссылки на 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

Настройте свои условия. Я выбрал метод, так как у вас есть только один ряд на 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 и @ достигаемый = 500000:

Name       Qtr  MinTarget   MaxTarget   MinPct  MaxPct
Json Ray    2   376000      516000      1.40    1.80
0
TomC 30 Май 2019 в 00:59

Вы должны иметь возможность просто использовать предложение 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;
0
under 28 Май 2019 в 03:27