我希望有人可以修改我现有的查询,并根据下面列出的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;
答案 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;