2015-06-23 123 views
1

所以我的表格式如下:选择与Microsoft Access SQL行最高值

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 

我不能使用的开关()函数,因为我有太多的变量,它给出了“太复杂”的错误。有任何想法吗?

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];

+3

你应该规范表设计,这将使这是一个相对简单的查询... –

回答

2

您的数据库未归的事情应该是这样。 您应该有一个type表,其中值为1,2,3,4,然后将表连接到您的project表。

|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;来得到你的结果。

+0

谢谢丹尼尔,这是一个有点复杂,但我想通了。我有大约7个左右的表格,我为每个表格创建了计算字段(每个计算都不相同),但计算解决方案是3种可能类型中的1种(良好的不良或风险)。我结束了保持相同的结构,但写联盟的所有查询来创建适当的格式(如你建议) – barker

+0

真棒,我很高兴它为你工作。 – Daniel

2

我完全同意Daniël的回答,我希望你能够修改数据模型。但是,如果你不能,你可能会声明函数,可以返回最大号的列表中:

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 

一个更高级的版本,以及其对应Min可以在
Allen Browne's Access Tips: MinOfList() and MaxOfList() functions

找到
+0

不是我正在寻找的解决方案,但这是非常有用的VBA,所以谢谢Golez,我可以在未来使用这个方法:) – barker