Tsql:为给定的一组字符串值每行搜索多个字段

时间:2014-06-23 12:58:11

标签: sql-server-2008 tsql ssrs-2008

我无法解决以下问题:我必须以足够通用的方式报告促销活动的总销售额,以便通过订阅处理例行用户请求。 (甚至让用户按需获取数据)

我正在尝试为SSRS报告编写一个查询,该报告将接受来自允许多个值的文本参数的输入。示例('Code1,Code2,Code3')...... 然后搜索下面示例表中的所有四个Sale“ID”字段 - 返回每个[DocumentNo],[LineNo_]组合,其中任何一个提供的代码出现在任何一个ID字段中。这四个字段不能为空,但它们可以是空字符串。可以将多个代码应用于订单行,但每个字段只能应用一个。每个[DocumentNo],[LineNo_]组合应该只在输出中出现一次,这样我就可以求和[qty]并获得正确的总和。

[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用于实施销售的促销类型他们没有设置销售或进行订单的数据输入。

1 个答案:

答案 0 :(得分:0)

我认为你可以用like

做你想做的事
where (','+@Codes+',' like '%,'+SalesDiscountReasonID+',%' or
       ','+@Codes+',' like '%,'+CouponID+',%' or
       ','+@Codes+',' like '%,'+CampaignID+',%' or
       ','+@Codes+',' like '%,'+PromotionCodeID+',%'
      )

额外的逗号用于避免在10100之间产生混淆。

如果您正在构建SQL,那么做起来要好得多:

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

一个原因是in可以使用索引,因此可以表现得更好。