Tsql: поиск нескольких полей в строке для заданного набора строковых значений

У меня возникают проблемы, когда я решаюсь над следующей проблемой, связанной с отчетом об общих продажах по рекламным акциям достаточно общим образом, чтобы я мог обрабатывать обычные запросы пользователей через подписку. (или даже позволить пользователям получать данные по запросу)

Я пытаюсь написать запрос для отчета SSRS, который будет принимать входные данные из текстового параметра, который допускает множественные значения. Пример ("Код1, Код2, Код3")… и затем ищет все четыре поля "ID продажи" в приведенной ниже таблице примера - возвращает каждую комбинацию [DocumentNo], [LineNo_], где любой из предоставленных кодов появляется в любом из ID поля. Четыре поля не могут быть пустыми, но они могут быть пустой строкой. Можно применить более одного кода к строке заказа, но только один в каждом поле. Каждая комбинация [DocumentNo], [LineNo_] должна появляться только один раз в выходных данных, чтобы я мог суммировать [кол-во] и получать правильную сумму.

[DocumentNo] [varchar](20) NOT NULL
[LineNo_] [int] NOT NULL
[SalesDiscountReasonID] [varchar](20) NOT NULL
[CouponID] [varchar](30) NOT NULL
[CampaignID] [varchar](20) NOT NULL
[PromotionCodeID] [varchar](20) NOT NULL
[qty] [Int] NOT NULL

Я не могу изменить структуру данных в хранилище данных и не могу ожидать, что пользователи, которые регулярно запрашивают этот отчет, будут отслеживать, какой тип продвижения Купон, Campaign, SalesDiscount, PromoCode использовался для реализации продажи, поскольку они не t настроить Продажи или сделать ввод данных заказов.

1 ответ

Я думаю, что вы можете делать то, что вы хотите с like:

where (','+@Codes+',' like '%,'+SalesDiscountReasonID+',%' or
       ','+@Codes+',' like '%,'+CouponID+',%' or
       ','+@Codes+',' like '%,'+CampaignID+',%' or
       ','+@Codes+',' like '%,'+PromotionCodeID+',%'
      )

Дополнительная запятая используется, чтобы избежать путаницы между, скажем, 10 а также 100,

Если вы создаете SQL, это намного, намного, намного лучше сделать:

where SalesDiscountReasonID in (''' + replace(@Codes, ',', ''',''') + ''') or
      CouponID in (''' + replace(@Codes, ',', ''',''') + ''') or
      CampaignID in (''' + replace(@Codes, ',', ''',''') + ''') or
      PromotionCodeID in (''' + replace(@Codes, ',', ''',''') + ''')'

Одна из причин в том, что in может использовать индексы и поэтому может работать намного лучше.

Другие вопросы по тегам