复杂的嵌套if语句

时间:2012-09-13 18:15:02

标签: ms-access ms-access-2007

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

条件#1 即可。比较以下3个字段的值并输出3个字段的最低值(排除空值):

“最低价格”
“售出最低价”
“lining_price_exception”

示例:如果“最低清单价格”= 3且“最低售价”= 7且“lining_price_exception”= null,则输出应为3.

conditon#2 即可。如果字段“overide_price”中的值不为null,则字段“overide_price”应替换条件#1的输出。如果“overide_price”中的值为null,则输出条件#1中的值。

SELECT q.Part_ID, q.[lowest list price], q.[lowest price sold], 
       q.lining_price_exception, q.overide_price
FROM qry_to_determine_wmx_price_01 AS q;

2 个答案:

答案 0 :(得分:2)

如果您将在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()表达式表示“如果它不是Null则返回overide_price,否则返回MinValue()表达式中的值”。

这是我提到的功能。

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

答案 1 :(得分:2)

这应该足够复杂了。这是经过测试的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;