#sql #sql-server
#sql #sql-сервер
Вопрос:
Наличие таблицы с уникальным цветовым диапазоном для каждого продукта и необходимость получения цвета на основе доступного количества на данный момент времени.
Не могли бы вы, пожалуйста, помочь динамически получать цвет для каждого продукта
create table test
(
Product varchar(200)
, Quantity int
, RangeRed varchar(200)
, RangeYellow varchar(200)
)
insert into test select 'A',10, '{value 1} <=5', '({value1} >5) and ({value1} <=10)'
insert into test select 'B',20, '{value 1} <=5', '({value1} >5) and ({value1} <=20)'
insert into test select 'C',50, '{value 1} <=5', '({value1} >5) and ({value1} <=10)'
insert into test select 'D',5, '{value 1} <=5', '({value1} >5) and ({value1} <=10)'
select Product, Quantity, case when RangeRed then 'Red' when RangeYellow then 'Yellow' else 'white' end as Color
select Product, Quantity,
Replace(RangeRed, '{value1}','Quantity') as RangeRed
, Replace(RangeYellow, '{value1}','Quantity') as RangeYellow
from test
) x
Ожидаемый результат :
Комментарии:
1. Каков ожидаемый результат?
Ответ №1:
Для этого вы должны использовать динамический SQL. Ниже приведен простой пример, но вы можете захотеть его улучшить.
Обратите внимание, что при этом используется хакерская форма объединения результатов из нескольких строк в один вывод. Есть лучшие способы сделать это, которые я оставляю в качестве упражнения для вас.
Будет решение, которое не требует union
объединения всех строк вместе, но для этого потребуется построение динамического выражения case для оценки состояния для каждого продукта.
create table #test
(
Product varchar(200)
, Quantity int
, RangeRed varchar(200)
, RangeYellow varchar(200)
)
insert into #test (Product, Quantity, RangeRed, RangeYellow)
values ('A', 10, '{Value1} <= 5', '({Value1} >5) and ({Value1} <=10)'),
('B', 20, '{Value1} <=5', '({Value1} >5) and ({Value1} <=20)'),
('C', 50, '{Value1} <=5', '({Value1} >5) and ({Value1} <=10)'),
('D', 5, '{Value1} <=5', '({Value1} >5) and ({Value1} <=10)')
declare @Sql nvarchar(max) = '';
select @Sql = @Sql case when @Sql = '' then '' else ' union all ' end 'select Product, Quantity, case when ' replace(RangeRed,'{Value1}','Quantity') ' then ''Red'' when ' replace(RangeYellow,'{Value1}','Quantity') ' then ''Yellow'' else ''White'' end Color from #test where Product = ''' Product '''' from #Test;
-- print @Sql; -- Debugging
exec (@Sql);
ВОЗВРАТ:
Product Quantity Colour
A 10 Yellow
B 20 Yellow
C 50 White
D 5 Red