Ms access 复杂嵌套if语句

Ms access 复杂嵌套if语句,ms-access,ms-access-2007,Ms Access,Ms Access 2007,我希望有人可以修改我现有的查询,并根据下面列出的2个条件为我提供SQL以便复制和粘贴。非常感谢你,纳撒尼尔 条件#1。比较以下3个字段的值,并输出3个字段中的最低值(不包括空值): “最低标价” “最低售价” “衬里\u价格\u例外” 示例:如果“最低标价”=3,“最低卖出价”=7,“最低价格例外”=null,则输出应为3 条件2。如果字段“overide_price”中的值不为空,则字段“overide_price”应替换来自条件#1的输出。如果“overide#u price”中的值为空,则

我希望有人可以修改我现有的查询,并根据下面列出的2个条件为我提供SQL以便复制和粘贴。非常感谢你,纳撒尼尔

条件#1。比较以下3个字段的值,并输出3个字段中的最低值(不包括空值):

“最低标价”
“最低售价”
“衬里\u价格\u例外”

示例:如果“最低标价”=3,“最低卖出价”=7,“最低价格例外”=null,则输出应为3

条件2。如果字段“overide_price”中的值不为空,则字段“overide_price”应替换来自条件#1的输出。如果“overide#u price”中的值为空,则输出条件#1中的值


如果要在Access会话中运行查询,可以使用自定义VBA函数来简化此操作

正在测试即时窗口中的
MinValue()
函数

? MinValue(4, Null, 2)
 2 
? MinValue(Null, Null, 2)
 2 
? MinValue(Null, Null, Null)
Null
所以你可以在这样的查询中处理你的条件#1

SELECT
    MinValue(
        q.[lowest list price],
        q.[lowest price sold], 
        q.lining_price_exception
    ) AS lowest_value
qry_to_determine_wmx_price_01 AS q;
至于你的条件#2,我认为
Nz()
函数会很有用

Nz(q.overide_price, MinValue(q.[lowest list price], q.[lowest price sold],
q.lining_price_exception))
基本上,
Nz()

这就是我提到的功能

Public Function MinValue(ParamArray pValues() As Variant) As Variant
    Dim i As Long
    Dim iUbound As Long
    Dim varMin As Variant
    iUbound = UBound(pValues)
    varMin = Null
    For i = 0 To iUbound
        If Not IsNull(pValues(i)) Then
            If Not IsNull(varMin) Then
                If pValues(i) < varMin Then
                    varMin = pValues(i)
                End If
            Else
                varMin = pValues(i)
            End If
        End If
    Next
    MinValue = varMin
End Function
公共函数MinValue(ParamArray pValues()作为变量)作为变量
我想我会坚持多久
我被束缚得那么久
Dim varMin作为变体
iUbound=UBound(pValues)
varMin=Null
对于i=0到i绑定
如果不是IsNull(pValues(i)),则
如果不是IsNull(varMin),则
如果pValues(i)
如果要在Access会话中运行查询,可以使用自定义VBA函数来简化查询

正在测试即时窗口中的
MinValue()
函数

? MinValue(4, Null, 2)
 2 
? MinValue(Null, Null, 2)
 2 
? MinValue(Null, Null, Null)
Null
所以你可以在这样的查询中处理你的条件#1

SELECT
    MinValue(
        q.[lowest list price],
        q.[lowest price sold], 
        q.lining_price_exception
    ) AS lowest_value
qry_to_determine_wmx_price_01 AS q;
至于你的条件#2,我认为
Nz()
函数会很有用

Nz(q.overide_price, MinValue(q.[lowest list price], q.[lowest price sold],
q.lining_price_exception))
基本上,
Nz()

这就是我提到的功能

Public Function MinValue(ParamArray pValues() As Variant) As Variant
    Dim i As Long
    Dim iUbound As Long
    Dim varMin As Variant
    iUbound = UBound(pValues)
    varMin = Null
    For i = 0 To iUbound
        If Not IsNull(pValues(i)) Then
            If Not IsNull(varMin) Then
                If pValues(i) < varMin Then
                    varMin = pValues(i)
                End If
            Else
                varMin = pValues(i)
            End If
        End If
    Next
    MinValue = varMin
End Function
公共函数MinValue(ParamArray pValues()作为变量)作为变量
我想我会坚持多久
我被束缚得那么久
Dim varMin作为变体
iUbound=UBound(pValues)
varMin=Null
对于i=0到i绑定
如果不是IsNull(pValues(i)),则
如果不是IsNull(varMin),则
如果pValues(i)
这对您来说应该足够复杂了。以下是测试SQL,无需定义满足这两个条件的任何VBA方法:

Select q.Part_ID, 
           q.[lowest list price], 
           q.[lowest price sold], 
           q.lining_price_exception, 
           q.overide_price,
           NZ(q.overide_price,
                 IIf(q.[lowest list price]<q.[lowest price sold] OR ISNULL(q.[lowest price sold]),
                       IIf(q.[lowest list price]<q.lining_price_exception or ISNULL(q.lining_price_exception),
                             NZ(q.[lowest list price],"No valid Price listed"),
                             q.lining_price_exception
                          ),
                       IIf(q.[lowest price sold]<q.lining_price_exception or ISNULL(q.lining_price_exception),
                             NZ(q.[lowest price sold],"No valid Price listed"),
                             q.lining_price_exception
                          )
                    )
                 ) as Actual_Low_Price        
from qry_to_determine_wmx_price_01 as q;
选择q.Part\u ID,
q、 [最低标价],
q、 [最低售价],
q、 价格例外,
q、 超过价格,
新西兰(q.overide_价格,

IIf(q[最低标价]这对您来说应该足够复杂了。下面是测试SQL,无需定义任何满足这两个条件的VBA方法:

Select q.Part_ID, 
           q.[lowest list price], 
           q.[lowest price sold], 
           q.lining_price_exception, 
           q.overide_price,
           NZ(q.overide_price,
                 IIf(q.[lowest list price]<q.[lowest price sold] OR ISNULL(q.[lowest price sold]),
                       IIf(q.[lowest list price]<q.lining_price_exception or ISNULL(q.lining_price_exception),
                             NZ(q.[lowest list price],"No valid Price listed"),
                             q.lining_price_exception
                          ),
                       IIf(q.[lowest price sold]<q.lining_price_exception or ISNULL(q.lining_price_exception),
                             NZ(q.[lowest price sold],"No valid Price listed"),
                             q.lining_price_exception
                          )
                    )
                 ) as Actual_Low_Price        
from qry_to_determine_wmx_price_01 as q;
选择q.Part\u ID,
q、 [最低标价],
q、 [最低售价],
q、 价格例外,
q、 超过价格,
新西兰(q.overide_价格,

IIf(q[最低标价]我承认,这绝对是一个更好的解决方案。:-)我承认,这绝对是一个更好的解决方案。:-)事实上,这就是ISNULLs的作用,因为它是一种痛苦…这就是为什么我说你的版本更好,如果只是因为它更容易阅读!我试图使我的版本可读,但你能做的只有这么多。丹尼尔,我更喜欢SQL,因为我不知道如何应用VBA。我运行了你的代码,它有一个轻微的错误,输出“#错误”对于字段“最低标价”不为null,但所有其他字段均为null的所有记录。是否可以修改SQL以防止此错误?请告知我是否应在数据源“qry_to_determinate_wmx_price_01”中将null转换为零(NZ函数)。非常感谢nathanielMake确保所有被比较的字段都是表中的数字。这应该可以解决问题。事实上,这就是ISNULLs的作用,因为它很痛苦…这就是为什么我说你的版本更好,因为它更容易阅读!我试着让我的可读,但你能做的只有这么多。Daniel,我引用SQL,因为我不知道如何应用VBA。我运行了你的代码,它有一个小错误,对所有记录输出“#错误”,其中“最低标价”字段不为null,但所有其他字段均为null。你能修改SQL以防止此错误吗?请告诉我是否应该将null转换为零(NZ函数)在我的数据源“qry_to_determinate_wmx_price_01”中。非常感谢Nathanielm确保所有要比较的字段都是表中的数字。这应该可以解决问题。