Динамически получает цвет на основе столбца, доступного в таблице

#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