0

我正在为每月销售制作一个存储过程。在存储过程中,我们有一个折扣。可以从三个不同的表中获取此折扣。如果折扣不在 id.rabatt 中,则应从 dp.rabatt 获取,如果不存在,则应从 ds.rabatt 获取。所以前两个可以是空的,而最后一个总是有折扣的。

我在设计程序的 WHEN 部分时遇到了很大的麻烦。如果你有时间,请看一下并在路上帮助我:

                     CASE (
                 when 
                Isnull(id.rabatt, Isnull(u.rabatt, id.rabatt)) then.. 
                when 
                 Isnull(dp.rabatt, Isnull(x.rabatt, dp.rabatt)) then..
                 when 
                 Isnull(ds.rabatt, Isnull(y.rabatt, ds.rabatt)) then..
                 end)
                 AS 'Discount', 

我必须使用 Isnull 的原因是,在每个 Discount 表中,我还有两个不同的折扣,一个永久有效(2999),一个具有选定的期间。就像我在这里展示的:

           LEFT OUTER JOIN discount AS id 
                    ON id.identifiers = isa.identifiers 
                       AND id.store = BV.name 
                       AND id.from_date <= isa.sales_date 
                       AND id.to_date >= isa.sales_date 
                       AND id.to_date < '2999-01-01' 
       LEFT OUTER JOIN discount AS u 
                    ON u.identifiers = isa.identifiers 
                       AND u.to_date = '2999-01-01' 

其他两个表的设计方式类似。

4

1 回答 1

1

您可以使用与使用 IsNull 函数类似的方式使用 coalesce 函数。IsNull 和 Coalesce 之间存在一些细微的差异,但有利于您的代码的显着差异是您可以拥有多个参数而无需嵌套它。

您的代码: Isnull(id.rabatt, Isnull(u.rabatt, id.rabatt))

等同于:Coalesce(id.rabatt, u.rabatt, id.rabatt)

接下来... case/when 有 2 种通用形式。

Case (Some Condition)
     When (Value 1) Then ...
     When (Value 2) Then ...
     Else (Default Value)
     End

或者

Case When (SomeCondition = Value1) Then ...
     When (SomeCondition = Value2) Then ...
     Else DefaultValue
     End

查看您的代码片段,您似乎使用的是第二种形式,但在 when 部分没有比较运算符。我想你想要这样的东西......

CASE When Coalesce(id.rabatt, u.rabatt, id.rabatt) Is Not NULL then.. 
     When Coalesce(dp.rabatt, x.rabatt, id.rabatt) Is Not NULL then..
     When Coalesce(ds.rabatt, y.rabatt, id.rabatt) Is Not NULL then..
     Else (Put a default value here)
     end AS [Discount]
于 2014-06-25T12:04:02.723 回答