0

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

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

“最低标价”
“最低售价”
“lining_price_exception”

例如:如果“最低标价”= 3,“最低售价”=7,“lining_price_exception”=null,则输出应为 3。

条件#2。如果“overide_price”字段中的值不为空,则“overide_price”字段应替换条件 #1 的输出。如果“overide_price”中的值为空,则输出条件#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;
4

2 回答 2

2

This should be complicated enough for you. Here is tested SQL no need to define any VBA methods which meets both criteria:

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;
于 2012-09-13T19:07:50.517 回答
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()表达式表示“overide_price如果不是 Null,则返回,否则从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
于 2012-09-13T18:52:57.927 回答