Я хочу, чтобы динамически рассчитывать значения таблиц и найти минимальные и максимальные цели из параметра
У меня есть следующая таблица целей с данными:
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 находится между
Результат должен быть таким:
ЕСЛИ четверть = 1 и AchtainedTarget = 400000 Я хочу запись, где AchtainedTarget находится между
Результат должен быть таким:
Если четверть = 2 и AchtainedTarget = 400000, я хочу суммировать столбец GivenTarget
из таблиц назначения, где Quarter = 1, Method = 'AB', Method_ID = 1 При Quarter = 2 Method = 'AB' Method_ID = 1 и т. Д. Для добавления каждого соответствующего метода и Method_ID с кварталами, и необходимо выбрать процентные значения из текущего квартала, т.е. квартала 2 в этом случае с соответствующими Method и Method_ID
Ожидаемые новые целевые таблицы для второго квартала должны быть следующими:
Теперь зависит от приведенной выше таблицы. Я хочу рассчитать Min_Target и Max_Target, как рассчитано ранее.
Ожидаемый результат с Quarter = 2 и AchtainedTarget = 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
Я не могу рассчитать значения таблицы динамически и найти минимальные и максимальные цели из параметра четверти.
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
Вы должны иметь возможность просто использовать предложение 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;
Новые вопросы
sql
Язык структурированных запросов (SQL) - это язык запросов к базам данных. Вопросы должны включать примеры кода, структуру таблицы, примеры данных и тег для используемой реализации СУБД (например, MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 и т. Д.). Если ваш вопрос относится исключительно к конкретной СУБД (использует определенные расширения / функции), используйте вместо этого тег этой СУБД. Ответы на вопросы, помеченные SQL, должны использовать стандарт ISO / IEC SQL.