满足所有条件即可享受“Great Indian Sale Discount”。 context 可以有多个 context_subCategory 值。 负面分组意味着强制条件。 正分组数表示可选条件,但其中一个可选条件必须为真。
“印度大促销折扣”将适用于以下情况
我正在寻找解决问题的干净方法。我需要从多个符合条件的折扣名称中进行选择。 子类别及其值是传入参数,即聚会地点、澳大利亚作为参数。
我的方法使用了大量的案例陈述。 上下文始终是相同的当事人、订单或客户,但对于不同的折扣名称,子类别可以不同。
下面是可选案例的代码。同样,我有一个强制选项的强制计数。 如果可选计数和强制计数都 > 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
) + ')'
还有其他更好的方法可以达到同样的效果吗?
这有点难看,但也许你可以这样做:
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'))
定制其余部分应该不会太难。