访问 SQL 将显示多个 maximum/minimum 值及其对应的大小写

Access SQL that will display multiple maximum/minimum values and their corresponding case

我正在尝试在 Microsoft Access 中创建一个 SQL 查询,它将为下面的每个字段生成 maximum/minimum 值,并 return 附上相应的大小写

**Force Table**
case            Flxmax   Flxmin  Frxmax  Frxmin 
hs00p16010od    582.24   666.81  796.44  -451.15    
hs00p16015od    878.7    878.7   1096.3  -500.36    
hs00p16020od    1071.95  1071.9  1281.2  -743.05    
hs00p16025od    1186.65  1186.6  1397.8  -959.36    

期望的输出

Flxmax   1186.65   hs00p16025od
Flxmin   666.81    hs00p16010od
Frxmax   1397.8    hs00p16025od
Frxmin   -959.36   hs00p16025od

当前代码(仅最大化 1 个字段,不能为相同的值选择 1 个最大值)

SELECT case, [Flxmax]
FROM Force
WHERE [Flxmax] = (SELECT max([Flxmax]) FROM Force);

此外,如果有多个相同的 max/min 值,是否可以只选择一个值。

关于table,包括此处显示的字段在内,总共有40个字段需要计算max/min个值。 records/cases的人数在3万左右。

我有 14 个相似的 table,我需要对它们进行 运行 相似的查询(案例名称,顺序相同,在所有案例中都是通用的)。正如您可以想象的那样,我希望将必要的查询数量保持在最低限度。

如果 Access SQL 有限制,是否可以使用 VBA 来实现?

查找电子表格的任务。

无论如何:

Select "Flxmax" As FField, [case], [Flxmax] 
From (SELECT case, [Flxmax]
    FROM Force
    WHERE [Flxmax] = (SELECT Max([Flxmax]) FROM Force))
Union All
Select "Flxmin" As FField, [case], [Flxmin] 
From (SELECT case, [Flxmin]
    FROM Force
    WHERE [Flxmin] = (SELECT Min([Flxmin]) FROM Force))
Union All    
Select "Frxmax" As FField, [case], [Frxmax] 
From (SELECT case, [Frxmax]
    FROM Force
    WHERE [Frxmax] = (SELECT Max([Frxmax]) FROM Force))
Union All    
Select "Frxmin" As FField, [case], [Frxmin] 
From (SELECT case, [Frxmin]
    FROM Force
    WHERE [Frxmin] = (SELECT Min([Frxmin]) FROM Force))

等等。

在 SQL 查询中,可以使用 user-defined 函数完成此测试 on-the-fly。

SELECT Case, Flxmax, Flxmin, Frxmax, Frxmin, 
    MAXPOSITIONz([Flxmax],[Flxmin],[Frxmax],[Frxmin]) As FieldPos,
    Choose([FieldPos],"Flxmax","Flxmin","Frxmax","Frxmin") As Choose1,
    Choose([FieldPos],[Flxmax],[Flxmin],[Frxmax],[Frxmin]) As Choose2
FROM MyTable

结果:

Case  Flxmax  Flxmin  Frxmax  Frxmin  FieldPos  Choose1  Choose2
aaaa  100000  100000  100000  100000         1   Flxmax   100000
bbbb  100000  100009  100008  100007         2   Flxmin   100009
cccc  100000  100001  100099  100099         3   Frxmax   100099
dddd  100001  100002  100003  100004         4   Frxmin   100004

函数:

'This function combines the features of Excel MAX() and Access Nz() to find Max, and allows Null or String'
Public Function MAXPOSITIONz(ParamArray ParameterData() As Variant) As Currency
    Dim Result As Currency: Result = 0
    Dim p As Variant
    Dim i as Long
    Dim ArrayLength as Long: ArrayLength = UBound(ParameterData) - LBound(ParameterData)
    Dim Position as Long: Position = 1
    
    If ArrayLength < 1 Then Return 1
    
    For i = 0 to ( UBound(ParameterData) - LBound(ParameterData) )
        If IsNumeric(Nz(ParameterData(i), "")) Then
            If CCur(ParameterData(i)) > Result Then
                Result = CCur(p)
                Position = i
            End If
        End If
    Next i
    
    MAXPOSITIONz = Position
End Function

也可以使用仅 returns 最大值的通用函数:

            MAXz([Field01],[Field02], etc ...)     'Decimal Numbers
Int(        MAXz([Field01],[Field02], etc ...) )   'Whole numbers
CDate(      MAXz([Field01],[Field02], etc ...) )   'Date with time
CDate( Int( MAXz([Field01],[Field02], etc ...) ) ) 'Date without time

泛型函数:

''This function combines the features of Excel MAX() and Access Nz() to find Max,
''and allows Null or String
Public Function MAXz(ParamArray ParameterData() As Variant) As Currency
    Dim Result As Currency: Result = 0
    Dim p As Variant
    
    For Each p In ParameterData
        If IsNumeric(Nz(p, "")) Then _
            If CCur(p) > Result Then _
                Result = CCur(p)
    Next p
    
    MAXz = Result
End Function

“作为货币”returns 十进制数。如果你不想要小数,你可以专门为 Date 或 Long 调整代码。