我有一张桌子。
表名: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
答案 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