如何在MS Access 2007中编写查询以在多个列中显示多个值?

时间:2013-05-07 05:05:39

标签: sql ms-access

我有一张桌子。

表名:tblRAC

Examiner Subj scheme pap_code moderator pap_accessed  pap_moderated
Kamble   DTE   EJ1E   12116    mahulkar     25            5
kamble   AEL   DE4E   12110    Patil        2             2
kamble   DTE   CO3C   12064    Nale         37            20
kamble   DTE   IF3E   12064                 01            
Kamble   DTE   IL1E   12116    kulkarni     35            5

如何在MS Access 2007中编写查询以获得如下输出。

subj    pap_Code   scheme      pap_accessed moderator
DTE      12116    EJ1E,IL1E     60          mahulkar,kulkarni
DTE      12064    CO3C,IF3E     38          Nale
AEL      12110    DE4E          02          Patil

                    Total  100    

1 个答案:

答案 0 :(得分:1)

我实际上决定将此作为答案而不是评论发布,以使其更容易访问。

你想要的正是其他DBMS提供的(我真的不喜欢使用),称为GROUP_CONCAT。我编辑了你的标题,使未来的搜索者更加明显(希望你不介意)。

由于Access在SQL语法中不支持GROUP_CONCAT,因此您可以编写一些时髦的SQL来希望复制它或只使用VBA。

以下是您可以使用的示例GROUP CONCAT VBA函数。发现here(我没写过)。

  Function Concatenate(pstrSQL As String, _
        Optional pstrDelim As String = ", ", _
        Optional pstrLastDelim As String = "") _
        As Variant
'   Created by Duane Hookom, 2003
'   this code may be included in any application/mdb providing
'   this statement is left intact
'   example
'   tblFamily with FamID as numeric primary key
'   tblFamMem with FamID, FirstName, DOB,...
'   return a comma separated list of FirstNames
'   for a FamID
'    John, Mary, Susan

'   ======= in a Query =========================
'   SELECT FamID,
'   Concatenate("SELECT FirstName FROM tblFamMem
'    WHERE FamID =" & [FamID]) as FirstNames
'   FROM tblFamily
'   ============================================

'   to get a return like Duane, Laura, Jake, and Chelsey

'   ======= in a Query =========================
'   SELECT FamID,
'   Concatenate("SELECT FirstName FROM tblFamMem
'    WHERE FamID =" & [FamID], ",",", and ") as FirstNames
'   FROM tblFamily
'   ============================================

'   If FamID is a string rather than numeric,
'    it will need to be delimited with quotes

'   ======= in a Query =========================
'   SELECT FamID,
'   Concatenate("SELECT FirstName FROM tblFamMem
'    WHERE FamID =""" & [FamID] & """", ",",", and ") as FirstNames
'   FROM tblFamily
'   ============================================


'======For DAO uncomment next 4 lines=======
'====== comment out ADO below =======
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Set db = CurrentDb
    Set rs = db.OpenRecordset(pstrSQL)

'======For ADO uncomment next two lines=====
'====== comment out DAO above ======
    'Dim rs As New ADODB.Recordset
    'length before last concatenation
    Dim intLenB4Last As Integer
    'rs.Open pstrSQL, CurrentProject.Connection, _
    adOpenKeyset, adLockOptimistic
    Dim strConcat As String 'build return string
    With rs
        If Not .EOF Then
            .MoveFirst
            Do While Not .EOF
                intLenB4Last = Len(strConcat)
                strConcat = strConcat & _
                .Fields(0) & pstrDelim
                .MoveNext
            Loop
        End If
        .Close
    End With
    Set rs = Nothing
'====== uncomment next line for DAO ========
    Set db = Nothing
    If Len(strConcat) > 0 Then
        strConcat = Left(strConcat, _
            Len(strConcat) - Len(pstrDelim))
        If Len(pstrLastDelim) > 0 Then
            strConcat = Left(strConcat, _
                intLenB4Last - Len(pstrDelim) - 1) _
                & pstrLastDelim & Mid(strConcat, intLenB4Last + 1)
        End If
    End If
    If Len(strConcat) > 0 Then
        Concatenate = strConcat
     Else
        Concatenate = Null
    End If
End Function