我正在Access 2007中创建一个数据库,目前我正在努力查询。只有一列,可以提出多个答案。所以,当我打开查询时,我得到3行,当给出3个答案时。我想将行连接成一个。有时没有答案,有时是1或2或最多3。
目前我的查询如下:
COLUMNNAMES :B - Latijnse benaming(太空)B - Nederlandse benaming(太空)Bloemen.B - 四月2.Value(太空)B - Klas(太空) - B - Leerkracht(太空) B - Locatie
ROW 1 Abelmochus(空间)(空间)Zaaien(空间)1ATA(空间)Depuydt(空间)Serre 1
ROW 2 Abelmochus(空间)(空间)Oogsten(空间)1ATA(空间)Depuydt(空间)Serre 1
ROW 3 Abelmochus(空间)(空间)Bemesten(空间)1ATA(空间)Depuydt(空间)Serre 1
我希望它看起来像这样:
ROW 1 Abelmochus(太空)(太空)Zaaien,Oogsten,Bemesten(太空)1ATA(太空)Depuydt(太空)Serre 1
tbl被称为Bloemen,这是目前查询的SQl:
SELECT Bloemen.[B - Latijnse benaming], Bloemen.[B - Nederlandse benaming], Bloemen.[B - April 2].Value, Bloemen.[B - Klas], Bloemen.[B - Leerkracht], Bloemen.[B - Locatie]
FROM Bloemen
WHERE (((Bloemen.[B - April 2].Value) Is Not Null));
任何人都可以帮我将行连接成一个。我不知道如何写一个SQL ...我必须为48个查询做这个,所以当它是标准时我会有所帮助。
非常感谢!!!!!!!
Jonas Roelens
答案 0 :(得分:4)
怎么样:
下面的代码示例将从SQL或字符串输入返回分隔列表。这是在查询中使用它的方法:
SELECT documents.MembersOnly,
ConcatList("SELECT FName From Persons WHERE Member=True",":") AS Who,
ConcatList("",":","Mary","Joe","Pat?") AS Others
FROM documents;
或者
SELECT tc.Company,
ConcatList("SELECT Contract
FROM tblservices
WHERE CompanyKey=" & tc.[CompanyKey],", ") AS Contracts
FROM tblCompanies tc
示例代码
Function ConcatList(strSQL As String, strDelim, _
ParamArray NameList() As Variant)
''Reference: Microsoft DAO x.x Object Library
Dim db As Database
Dim rs As DAO.Recordset
Dim strList As String
Set db = CurrentDb
If strSQL <> "" Then
Set rs = db.OpenRecordset(strSQL)
Do While Not rs.EOF
strList = strList & strDelim & rs.Fields(0)
rs.MoveNext
Loop
strList = Mid(strList, Len(strDelim) + 1)
Else
strList = Join(NameList, strDelim)
End If
ConcatList = strList
End Function
来自:http://wiki.lessthandot.com/index.php/Concatenate_a_List_into_a_Single_Field_%28Column%29
上面的链接现在包含下面的ADO版本,我在此处包含@onedaywhen从未添加过版本。
这更快更容易,但对字段(列)名称更敏感。你需要确保它们不是保留字。 ADO版本的另一个优点是您不限制要连接的列数:
SELECT d.DeptID, d.Department,
ConcatADO("SELECT FName & ' ' & SName, Address FROM Persons
WHERE DeptID=" & [d].[DeptID],", "," : ") AS Who
FROM Departments AS d INNER JOIN Persons AS p ON d.DeptID = p.DeptID
GROUP BY d.DeptID, d.Department, 3;
Function ConcatADO(strSQL As String, strColDelim, _
strRowDelim, ParamArray NameList() As Variant)
Dim rs As New ADODB.Recordset
Dim strList As String
On Error GoTo Proc_Err
If strSQL <> "" Then
rs.Open strSQL, CurrentProject.Connection
strList = rs.GetString(, , strColDelim, strRowDelim)
strList = Mid(strList, 1, Len(strList) - Len(strRowDelim))
Else
strList = Join(NameList, strColDelim)
End If
ConcatADO = strList
Exit Function
Proc_Err:
ConcatADO = "***" & UCase(Err.Description)
End Function
答案 1 :(得分:1)
“标准”SQL不会这样做,我想。 Access中可能有一些功能可以返回一个包含列值的数组......但除非有其他人根据这样的功能提出一个很酷的建议,否则我会说“不”。
这种处理通常必须在调用SQL的编程环境中完成。您使用某种报告生成器(如BIRT)还是正在使用“直接”JDBC?如果是后者,那么您可以简单地遍历ResultSet以将该复合列放在一起。