Select 具有 Microsoft 访问权限的行中的最大值 sql

Select highest value in row with microsoft access sql

所以我的table格式如下:

Project | type1 | type2 | type3 | type4  
a | 0 | 1 | 1 | 2  
b | 1 | 0 | 1 | 1  
c | 0 | 0 | 0 | 0  

我需要每一行的最大值,如下:

Project | max  
a | 2  
b | 1  
c | 0 

我无法在 access 中使用 switch() 函数,因为我有太多变量,它给出了 "too complex" 错误。有任何想法吗?

SELECT Switch(
[MaxOfBudget Trigger] = 2, "Critical",
[MaxOfSchedule Trigger] = 2, "Critical",
[MaxOfSubmittals Trigger] = 2, "Critical",
[MaxOfSafety Trigger] = 2, "Critical",
[MaxOfChange Orders Trigger] = 2, "Critical",
[MaxOfContingency Trigger] = 2, "Critical",
[MaxOfRFIs Trigger] = 2, "Critical",
[MaxOfBudget Trigger] = 1, "At Risk",
[MaxOfSchedule Trigger] = 1, "At Risk",
[MaxOfSubmittals Trigger] = 1, "At Risk",
[MaxOfSafety Trigger] = 1, "At Risk",
[MaxOfChange Orders Trigger] = 1, "At Risk",
[MaxOfContingency Trigger] = 1, "At Risk",
[MaxOfRFIs Trigger] = 1, "At Risk",
[MaxOfBudget Trigger] = 0, "Okay",
[MaxOfSchedule Trigger] = 0, "Okay",
[MaxOfSubmittals Trigger] = 0, "Okay",
[MaxOfSafety Trigger] = 0, "Okay",
[MaxOfChange Orders Trigger] = 0, "Okay",
[MaxOfContingency Trigger] = 0, "Okay",
[MaxOfRFIs Trigger] = 0, "Okay", )
AS test, [Project Triggers].[Project Number]
FROM [Project Triggers];

您的数据库未按应有的方式规范化。 您应该有一个 type table,其中包含值 1,2,3,4,然后将 table 连接到您的 project table。

|project | type_id | value |
+--------+---------+-------+
|a       | 1       | 0     |
|a       | 2       | 1     |
|a       | 3       | 1     |
|a       | 4       | 2     |
|b       | 1       | 1     |
|b       | 2       | 0     |
|b       | 3       | 1     |
|b       | 4       | 1     |
|c       | 1       | 0     |
|c       | 2       | 0     |
|c       | 3       | 0     |
|c       | 4       | 0     |

然后您可以执行 SELECT project, max(value) FROM project_type_values GROUP BY project; 之类的操作来获取结果。

我完全同意Daniël 的回答,希望您能够修改数据模型。但如果不能,您可以声明一个函数,该函数可以 return 最大的数字列表:

Function MaxOfList(ParamArray varValues()) As Variant
    Dim i As Integer        'Loop controller.
    Dim varMax As Variant   'Largest value found so far.

    varMax = Null           'Initialize to null

    For i = LBound(varValues) To UBound(varValues)
      If varMax >= varValues(i) Then
        'do nothing
      Else
        varMax = varValues(i)
      End If
    Next

    MaxOfList = varMax
End Function

可以在
Allen Browne's Access Tips: MinOfList() and MaxOfList() functions

找到稍微更高级的版本及其 Min 对应版本