2015-06-23 126 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