Bryan Schmidt
asked on
Is it possible to select a minimum and maximum value from multiple fields in Access 2010?
I have eight fields that contain counts or percentages of loans made by institution and need to be able to determine which of the these fields has the lowest and highest values. Ideally, I would use a function like Min([field1], [field2], [field3], etc) to determine which field has the minimum value but no such functions exists in Access 2010. Each field contains values for a specific category so the values in all fields cannot be combined. The goal is to show, by institution, which fields have the lowest and highest values.
If someone can suggest a fairly easy way to determine the minimum or maximum value for a group of fields I would appreciate the advice.
If someone can suggest a fairly easy way to determine the minimum or maximum value for a group of fields I would appreciate the advice.
ASKER
The approach you recommend would be useful if it was necessary to calculate a minimum or maximum value for each field. In my case there is only one value per field for each institution so there is no need to calculate a minimum or maximum value for the field itself . The query results may theoretically resemble the following. Each number represents the value of each field. The sort is by institution.
Institution 2 (field1), 5 (field2), 4 (field3), 7 (field4), 0 (field5), 9 (field6), 6 (field7), 10 (field8)
What I need is the ability to identify the minimum and maximum value identified for each institution from the eight different fields. In the above example, the minimum value is from field 5 and the maximum is from field 8. I want to add a column to the query to calculate the minimum and maximum value of the eight fields.
Institution 2 (field1), 5 (field2), 4 (field3), 7 (field4), 0 (field5), 9 (field6), 6 (field7), 10 (field8)
What I need is the ability to identify the minimum and maximum value identified for each institution from the eight different fields. In the above example, the minimum value is from field 5 and the maximum is from field 8. I want to add a column to the query to calculate the minimum and maximum value of the eight fields.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
You can modify the function below to accept currency and not dates.
Then:
curMin = CurMin([Field1], [Field2], [Field3], [Field4])
Then:
curMin = CurMin([Field1], [Field2], [Field3], [Field4])
Public Function DateMax(ParamArray avarDates() As Variant) As Date
' Return maximum date/time Value of elements in
' array avarDates().
' If no elements of array avarDates() are dates,
' Value of cdatEmpty is returned.
'
' 2003-09-30. Cactus Data ApS, CPH.
' Return Value for an empty array.
Const cdatEmpty As Date = #1/1/100#
Dim varDate As Variant
Dim varDateMax As Variant
For Each varDate In avarDates()
If IsDate(varDate) Then
If VarType(varDate) <> vbDate Then
varDate = CDate(varDate)
End If
If varDate > varDateMax Then
varDateMax = varDate
End If
End If
Next
If IsEmpty(varDateMax) Then
varDateMax = cdatEmpty
End If
DateMax = varDateMax
End Function
/gustav
ASKER
Pat,
The values that appear in fields 1 through 8 are determined using queries that either sum the count of all records or calculate a percentage. You are correct in that my values come from a crosstab query and tried the examples you suggested. They do work but the caveat is that null values are ignored (probably as expected), and if there are multiple columns with identical values the first field with the same value is identified as either minimum or maximum. This requires that one be attentive to what is happening but I'm guessing this approach is the best option based on your comments. Thanks for providing it.
The values that appear in fields 1 through 8 are determined using queries that either sum the count of all records or calculate a percentage. You are correct in that my values come from a crosstab query and tried the examples you suggested. They do work but the caveat is that null values are ignored (probably as expected), and if there are multiple columns with identical values the first field with the same value is identified as either minimum or maximum. This requires that one be attentive to what is happening but I'm guessing this approach is the best option based on your comments. Thanks for providing it.
ASKER
Gustav,
Thanks for your code example. For my purposes Pat's recommendation is better suited to my needs but I will keep your example for possible future use.
Thanks for your code example. For my purposes Pat's recommendation is better suited to my needs but I will keep your example for possible future use.
Access functions ignore nulls. So if you average:
3, null, 3 you get 3
but
3, 0, 3 gives you 2
So, you need to control whether a column returns 0 or null to get the result you want. In almost all cases, I have numeric values default to null because I want the first result. If I have no value, I don't want the record included in the aggregation. Once someone provides a value, if that value is 0, it has meaning and so should be included.
As to which column Access chooses when there are duplicate values - at least it is consistent. I'm not sure you can ask for more. You would need to write a custom function to get a different result but what would you want it to be?
3, null, 3 you get 3
but
3, 0, 3 gives you 2
So, you need to control whether a column returns 0 or null to get the result you want. In almost all cases, I have numeric values default to null because I want the first result. If I have no value, I don't want the record included in the aggregation. Once someone provides a value, if that value is 0, it has meaning and so should be included.
As to which column Access chooses when there are duplicate values - at least it is consistent. I'm not sure you can ask for more. You would need to write a custom function to get a different result but what would you want it to be?
Open in new window