2016-04-04 11 views
0

Ich habe Beispieldaten in Access2010 .mdb wie unten beschrieben, die PipeId ist die gleiche für die drei TVObservations. Die FS, OB und RB beschreibt die Art der Beobachtung, die ich brauche, um die Anzahl der Beobachtungen zu zählen.Mehrere verschachtelte Iif- und count-Anweisungen in einer Zelle

Sample:

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

benötigt Ausgabe:

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

ich die Anzahl der Beobachtungen bekommen, aber die Beobachtungen mit Name/Titel, bevor er in einer Zelle zurückkehrt erweist sich als schwierig.

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

Ich bin nicht sicher, ob dies möglich ist oder nicht, aber können Sie AS innerhalb einer Iif-Anweisung zurückgeben? So vielleicht: 'Graf (Iif ([TVObservation] =" FS "AS FS:, stimmt, IIf ([TVObservation] =" OB "AS OB:, Richtig, IIf (TVObservation) =" RB "AS RB: , True, Null)))) AS NumberOf' – FoolzRailer

+0

Ich denke, Sie müssen dies neu formulieren. – Gustav

+0

MS Access hat keine Gruppenverkettungsfunktion. Überprüfen Sie diesen Link für allans braune Lösung. http://allenbrowne.com/func-concat.html –

Antwort

1

Als Follow-on von dem, was @ krish-km erwähnt, ist hier eine Funktion, die ich von Allen Browne's ConcatRelated function angepasst haben (beachten Sie, dass ich eine Menge des ursprünglichen des Versorgers für allgemeine Zwecke entfernt haben, so sollten nur verwendet werden für Ihr spezifisches Szenario).

dies in einem VBA-Modul Setzen ...

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 

Sie werden dann in der Lage sein, diese Funktion in einer SQL-Anweisung zu verwenden.

Das erste und das zweite Argument sind Ihre beiden Felder, die Sie in die durch Kommas getrennte Liste verketten möchten. Diese werden als Strings übergeben, also verwenden Sie doppelte Anführungszeichen. Das dritte und vierte Argument ist das Feld, dessen Wert für die Datensätze, die Sie zusammenzufassen versuchen, gleich ist (in Ihrem Fall ist es PipeID). Beachten Sie, dass das Argument 3 in Anführungszeichen "PipeID" und das Argument 4 das Feld sql-reference sein muss. Es muss also nicht in Anführungszeichen tblTvObservations.PipeID stehen.

Das fünfte Argument ist das Feld, das Sie entweder in strField oder strField2 angegeben haben und möchten, dass die kommagetrennte Liste nach geordnet werden soll.

Das sechste und letzte Argument ist der Name der Tabelle/Abfrage, woher diese Daten stammen.

Hier ist ein Beispiel davon in einer SQL-Abfrage verwendet ...

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

... das folgende Ergebnis zu erhalten:

enter image description here

+0

Fast funktioniert, in NumberOf/Antalbemaerkning Ich scheinen alle TVObservations in einer langen Liste zu bekommen, anstelle von denen für die spezifische PipeID. Ich nehme an, ich mache etwas falsch. Ich habe vergessen zu erwähnen, dass diese Konkatation auf einer Abfrage basiert, weiß nicht, ob das einen Effekt hat? 'SELECT Antal_Rorenestielstand.PipeID, ConcatRelated ("TvObservation", "NumberOf", "Antal_Rorenestilstand") als AntalBemaerkning FROM Antal_Rorenestilstand GROUP BY Antal_Rorenestilstand.LedningsID; ' http://i.imgur.com/IFpCD8j.png?1 – FoolzRailer

+0

Shouldn 't ihr gruppiert nach 'PipeID?' statt 'LedningsID'? –

+0

Oh yeah, es ist gruppiert von PipeID, ich übersetze von Dänisch nach Englisch, nur um eine Vorstellung davon zu geben, was der Grund dafür ist, habe ich in meiner Übersetzung übersehen. 'Antal_Rorenestilstand.PipeID, ConcatRelated (" TvObservation "," NumberOf "," Antal_Rorenestilstand ") AS AntalBemaerkning FROM Antal_Rorenestilstand GROUP BY Antal_Rorenestilstand.PipeID;' – FoolzRailer

Verwandte Themen