2016-04-04 28 views
0

我在Access2010 .mdb中有一個示例數據,如下所述,PipeId對於三個TVObservations是相同的。 FS,OB和RB描述了觀察的類型,我需要計算觀察次數。在一個單元格中嵌套多個嵌套的Iif和計數語句

的sampleData:

| PipeID | TVObservation | NumberOf | 
|--------|---------------|----------| 
| 301 |  FS  | 2  | 
| 301 |  OB  | 2  | 
| 301 |  RB  | 1  | 

所需輸出:

| PipeID |  NumberOf  | 
|--------|---------------------| 
| 301 | FS: 2, OB: 2, RB: 1 | 

我能得到的觀測次數,但有一個名稱返回的意見/前冠軍,在一個細胞被證明是困難的。

Count(Iif([TVObservation]="FS",True,IIf([TVObservation]="OB",True,IIf(TVObservation]="RB",True,Null)))) AS NumberOf 
+0

我不知道這是可能的或者不是,但是你能在Iif語句中返回AS嗎? 也許這樣: 'Count(Iif([TVObservation] =「FS」AS FS:,True,IIf([TVObservation] =「OB」AS OB:,True,IIf(TVObservation] =「RB」AS RB: ,True,Null))))AS NumberOf' – FoolzRailer

+0

我認爲你需要重寫這個。 – Gustav

+0

MS Access沒有組連接功能。檢查這個鏈接爲艾倫棕色解決方案。 http://allenbrowne.com/func-concat.html –

回答

1

作爲後續從什麼@ krish公里提到的,這裏是我改編自Allen Browne's ConcatRelated function(請注意,我去掉了很多原來的普通實用的功能,所以應該只使用爲您的具體情況)。

一個VBA模塊將這個......

Public Function ConcatRelated(strField1 As String, _ 
       strField2 As String, _ 
       strRelField As String, _ 
       lngRelFieldVal As Long, _ 
       strOrderBy As String, _ 
       strTable As String, _ 
       Optional strSeparator = ", ") As Variant 

On Error GoTo Err_Handler 

    Dim db As DAO.Database   ' Database 
    Dim rs As DAO.Recordset   ' 
    Dim strSql As String   ' SQL statement 
    Dim strOut As String   ' Output string to concatenate to. 
    Dim lngLen As Long    ' Length of string. 

    ' Initialize to Null 
    ConcatRelated = Null 

    ' Find related records limited by related field 
    strSql = "SELECT " & strRelField & ", " & strField1 & ", " & strField2 _ 
      & " FROM " & strTable & " WHERE " & strRelField & " = " & lngRelFieldVal _ 
      & " ORDER BY " & strOrderBy 

    Set db = CurrentDb 
    Set rs = db.OpenRecordset(strSql) 

    ' Loop through related fields to build comma separated list 
    Do While Not rs.EOF 
     strOut = strOut & rs.Fields(strField1) & ": " & rs.Fields(strField2) & strSeparator 
     rs.MoveNext   
    Loop 

    rs.Close 

    ' Return the string without the trailing separator. 
    lngLen = Len(strOut) - Len(strSeparator) 
    If _ 
     lngLen > 0 _ 
    Then 
     ConcatRelated = Left(strOut, lngLen) 
    End If 

Exit_Handler: 
    'Clean up 
    Set rs = Nothing 
    Set db = Nothing 
    Exit Function 

Err_Handler: 
    MsgBox "Error " & Err.Number & ": " & Err.Description, vbExclamation, "ConcatRelated()" 
    Resume Exit_Handler 

End Function 

然後您就可以在SQL語句中使用此功能。

第一個和第二個參數是您想要連接到逗號分隔列表的2個字段;這些作爲字符串傳遞,因此使用雙引號。

第三和第四個參數是這個字段的值在你試圖總結的記錄中是相同的(在你的情況下它是PipeID)。請注意,參數3需要使用雙引號"PipeID",而參數4是sql引用字段,因此不得使用引號tblTvObservations.PipeID

第五個參數是您在strFieldstrField2中指定的字段,您希望按逗號分隔列表排序。

第六個也是最後一個參數是該數據來自的表/查詢名稱。

下面是一個SQL查詢中使用它的一個例子...

SELECT tblTvObservations.PipeID, ConcatRelated("TVObservation","NumberOf","PipeID",tblTvObservations.PipeID,"TVObservation","tblTvObservations") AS NumberOf 
FROM tblTvObservations; 

...得到以下結果:

enter image description here

+0

幾乎可以在NumberOf/Antalbemaerkning中工作,我似乎將所有TVObservations獲取到一個長列表中,而不是那些適用於特定PipeID的列表。我認爲我做錯了什麼。我忘了提及這個concate是基於一個查詢,不知道這是否有效果? 'SELECT Antal_Rorenestilstand。PIPEID,ConcatRelated( 「TvObservation」, 「NumberOf」, 「Antal_Rorenestilstand」)AS AntalBemaerkning FROM Antal_Rorenestilstand GROUP BY Antal_Rorenestilstand.LedningsID;' http://i.imgur.com/IFpCD8j.png?1 – FoolzRailer

+0

不該你用「PipeID?」而不是「LedningsID」分組嗎? –

+0

哦,是的,它被PipeID分組,我正在翻譯從丹麥語到英語,只是想知道這是什麼目的,錯過了我的翻譯。 'Antal_Rorenestilstand.PipeID,ConcatRelated(「TvObservation」,「NumberOf」,「Antal_Rorenestilstand」)AntalBemaerkning FROM Antal_Rorenestilstand GROUP BY Antal_Rorenestilstand.PipeID;' – FoolzRailer