检索符合所有条件的数据行

问题描述 投票:0回答:1

满足所有条件即可享受“Great Indian Sale Discount”。 context 可以有多个 context_subCategory 值。 负面分组意味着强制条件。 正分组数表示可选条件,但其中一个可选条件必须为真。

“印度大促销折扣”将适用于以下情况

  • context Party 和 subCategry partyLocation 不等于 (NOT=) Australia
  • 上下文订单和订单类型 = 现金 以下其中一项为真(正分组数)
  • 客户背景和子类别客户名称 = Shubh
  • 客户背景和客户 ID = 12
  • 客户背景和客户位置 = 堪培拉

我正在寻找解决问题的干净方法。我需要从多个符合条件的折扣名称中进行选择。 子类别及其值是传入参数,即聚会地点、澳大利亚作为参数。

我的方法使用了大量的案例陈述。 上下文始终是相同的当事人、订单或客户,但对于不同的折扣名称,子类别可以不同。

下面是可选案例的代码。同样,我有一个强制选项的强制计数。 如果可选计数和强制计数都 > 0,我将选择该折扣名称。

SET @sql  = 'SET @optionalCount = (select count(*) from #discountData where ' + (            
 SELECT CASE WHEN @context = 'PARTY'            
      THEN 'CONTEXT = ''' + @context + ''' and context_value= ' + (case statment for selecting subcategory )          
      WHEN @context = 'CUSTOMER'            
      THEN 'CONTEXT = ''' + @context + ''' and context_value= ' + (case statment for selecting subcategory)          
      WHEN @context = 'ORDER'            
      THEN 'CONTEXT = ''' + @context + ''' and context_value= ' + (case statment for selecting subcategory)             
      END            
) + ')'        

还有其他更好的方法可以达到同样的效果吗?

sql sql-server sql-server-2014
1个回答
0
投票

这有点难看,但也许你可以这样做:

SELECT  [Discount Name], STRING_AGG(CASE WHEN asign = -1 THEN 'WHERE 1 = 1 ' ELSE ' AND(1 = 0 ' END + aggvalue + CASE WHEN asign = 1 THEN ')' ELSE '' END, '') within GROUP(ORDER BY asign)
FROM    (
    SELECT  [Discount Name]
    ,   SIGN([grouping number]) AS asign
    ,   STRING_AGG(CONCAT(CASE sign([grouping number]) WHEN 1 THEN ' OR ' ELSE 'AND ' END,'(context = ', quotename(context, ''''), ' AND ', quotename(context_subcategory), replace(operator, 'NOT=', '<>'), quotename(context_value, ''''), ')'), '') AS aggValue
    FROM
    (
        VALUES  (N'Great Indian Sale Discount', -1, N'Party', N'partyLocation', N'Australia', N'NOT=')
        ,   (N'Great Indian Sale Discount', -1, N'Order', N'ordertype', N'cash', N'=')
        ,   (N'Great Indian Sale Discount', 1, N'Customer', N'customerName', N'shubh', N'=')
        ,   (N'Great Indian Sale Discount', 2, N'Customer', N'customerid', N'12', N'=')
        ,   (N'Great Indian Sale Discount', 3, N'Customer', N'customer Location', N'Canberra', N'=')
    ) t ([Discount Name],[grouping number],context,context_subCategory,context_value,operator)
    
    GROUP BY sign([grouping number]), [Discount Name]
    ) x
GROUP BY [Discount Name]

您可以根据折扣和分组编号的符号进行分组,一个为强制参数,一个为可选参数。然后将条件聚合成一个字符串并处理 AND 和 OR。

然后在外部聚合中将它们放在一起并创建最终的 WHERE 条件。

以上输出:

WHERE 1 = 1 AND (context = 'Order' AND [ordertype]='cash')AND (context = 'Party' AND [partyLocation]<>'Australia') AND(1 = 0  OR (context = 'Customer' AND [customerid]='12') OR (context = 'Customer' AND [customer Location]='Canberra') OR (context = 'Customer' AND [customerName]='shubh'))

定制其余部分应该不会太难。

© www.soinside.com 2019 - 2024. All rights reserved.