поэтому я создал таблицу клиентов, которая выглядит примерно так
Каждый клиент является либо новым, либо повторяющимся, либо повторно активированным, и каждый клиент может быть только одного типа, поэтому независимо от его типа в этом поле стоит 1, а во всех остальных полях — 0.
Я создал отчет, в котором я хочу иметь параметр, называемый типом клиента, который позволяет вам выбирать новых, повторяющихся, повторно активированных и все, и он покажет вам только выбранный вами тип клиента.
Я не знаю, как это сделать.
Я выполнил весь запрос, мне просто нужна помощь с предложением where.
Псевдокод будет примерно таким
Case when @CustomerType = 'NEW'
THEN where cs.brandnewcustomer = 1
Case when @CustomerType = 'RECURRING'
THEN where cs.recurringcustomer= 1
Case when @CustomerType = 'REACTIVATED'
THEN where cs.reactivatedcustomer= 1
else case when @CustomerType = 'All' end
Есть ли у кого-нибудь советы о том, как превратить это в реальный код?
Вы можете сформировать свои условия как:
WHERE (cs.brandnewcustomer = 1 AND @CustomerType = 'NEW')
OR
(cs.recurringcustomer = 1 AND @CustomerType = 'RECURRING')
OR
(cs.reactivatedcustome = 1 AND @CustomerType = 'REACTIVATED')
OR
(@CustomerType = 'ALL')
or (@CustomerType = 'All')
@GordonLinoff Да, только что добавил. Спасибо.
Поместите этот оператор CASE в предложение WHERE:
select * from customers
where 1 = case @CustomerType
when 'NEW' then brandnewcustomer
when 'RECURRING' then recurringcustomer
when 'REACTIVATED' then reactivatedcustomer
when 'All' then 1
end
Если параметр не соответствует ни одному из 4 значений, то ничего не будет возвращено.
Смотрите демо.
Это должно быть структурировано следующим образом:
SELECT ... FROM ...
WHERE cs.brandnewcustomer = CASE WHEN @CustomerType = 'NEW' THEN 1 ELSE 0 END
AND cs.recurringcustomer = CASE WHEN @CustomerType = 'RECURRING' THEN 1 ELSE 0 END
AND cs.reactivatedcustomer = CASE WHEN @CustomerType = 'REACTIVATED' THEN 1 ELSE 0 END
OR 1 = CASE WHEN @CustomerType = 'All' THEN 1 ELSE 0 END
Некоторые другие решения работают, но мое — единственное из перечисленных (пока что), обеспечивающее целостность данных. Если (случайно) у вас есть резервные данные, в которых 1 соответствует более чем одному типу клиентов, вы получите совпадение «первой победы» с остальными. С моим никто не выиграет за неточные данные.
Я думаю, что это должно быть нормализовано
Типы клиентов должны быть в таблице с первичным ключом tb_CustomerType.
введите описание изображения здесь
Таблица клиентов должна иметь внешний ключ для типа клиента tb_Customer
введите описание изображения здесь
вам не нужно иметь оператор case, если у вас такая структура таблицы
хотя я согласен, что данные необходимо нормализовать, ваш ответ не является решением и более уместно изложен в комментарии. Я удивлен, что другие не проголосовали за ваш ответ, поскольку он не соответствует критериям сайта для решения.
Это может быть воспринято как решение, если окружающая среда не может быть изменена, но я действительно считаю, что правильный путь должен быть указан, чтобы другие могли думать под другим углом к решению.
Вы можете использовать условие if, if (@customerType='new') begin select * from table where brandnewcustomer=1 end .. и т.д.