将行连接成1 - 访问2007

时间:2009-12-17 09:42:15

标签: ms-access

我正在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

2 个答案:

答案 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以将该复合列放在一起。