combine many return data from field in a new query INTO one field

Access 2010

I have a query that returns a "many" result.

SKU               EXPORT_ME          COUNTRY_CODE      
2WE34                   N                           AR
2WE34                   N                           BE
2WE34                   N                           ZE
2X464S                  Y                                                      
3WWW1                N                           RD
3WWW1                N                           SW
3WWW1                N                           CN
3WWW1                N                           HU
3WWC4                 Y                          

If the "SKU" is repeated then combine the data in the "COUNTRY_CODE"field together

The result would be
SKU               EXPORT_ME          COUNTRY_CODE      
2WE34                   N                           AR;BE;ZE
2X464S                  Y                                                      
3WWW1                N                           RD; SW; CN;HU
3WWC4                 Y                            

Who is Participating?

Improve company productivity with a Business Account.Sign Up

Patrick MatthewsConnect With a Mentor Commented:
Rey's post above should cover the immediate need.  If you need a generalized approach to grouped concatenation, please see my article on the subject here.

From that article, add this UDF to a regular VBA module:

Function DConcat(ConcatColumns As String, Tbl As String, Optional Criteria As String = "", _
    Optional Delimiter1 As String = ", ", Optional Delimiter2 As String = ", ", _
    Optional Distinct As Boolean = True, Optional Sort As String = "", _
    Optional Limit As Long = 0)
    ' Function by Patrick G. Matthews, basically embellishing an approach seen in many
    ' incarnations over the years
    ' Requires reference to Microsoft DAO library
    ' This function is intended as a "domain aggregate" that concatenates (and delimits) the
    ' various values rather than the more usual Count, Sum, Min, Max, etc.  For example:
    '    Select Field1, DConcat("Field2", "SomeTable", "[Field1] = '" & Field1 & "'") AS List
    '    FROM SomeTable
    '    GROUP BY Field1
    ' will return the distinct values of Field1, along with a concatenated list of all the
    ' distinct Field2 values associated with each Field1 value.
    ' ConcatColumns is a comma-delimited list of columns to be concatenated (typically just
    '   one column, but the function accommodates multiple).  Place field names in square
    '   brackets if they do not meet the customary rules for naming DB objects
    ' Tbl is the table/query the data are pulled from.  Place table name in square brackets
    '   if they do not meet the customary rules for naming DB objects
    ' Criteria (optional) are the criteria to be applied in the grouping.  Be sure to use And
    '   or Or as needed to build the right logic, and to encase text values in single quotes
    '   and dates in #
    ' Delimiter1 (optional) is the delimiter used in the concatenation (default is ", ").
    '   Delimiter1 is applied to each row in the code query's result set
    ' Delimiter2 (optional) is the delimiter used in concatenating each column in the result
    '   set if ConcatColumns specifies more than one column (default is ", ")
    ' Distinct (optional) determines whether the distinct values are concatenated (True,
    '   default), or whether all values are concatenated (and thus may get repeated)
    ' Sort (optional) indicates whether the concatenated string is sorted, and if so, the
    '   columns used for the sort.  As you would in an ORDER BY clause, use Asc or Desc to
    '   indicate whether the column is sorted ascending or descending.  If Asc/Desc is
    '   omitted, Asc is assumed by the query engine.  Note that if you use any columns
    '   in the Sort argument that are not in the ConcatColumns argument, you must use
    '   False for the Distinct argument
    ' Limit (optional) places a limit on how many items are placed into the concatenated string.
    '   The Limit argument works as a TOP N qualifier in the SELECT clause
    Dim rs As DAO.Recordset
    Dim SQL As String
    Dim ThisItem As String
    Dim FieldCounter As Long
    On Error GoTo ErrHandler
    ' Initialize to Null
    DConcat = Null
    ' Build up a query to grab the information needed for the concatenation
    SQL = "SELECT " & IIf(Distinct, "DISTINCT ", "") & _
            IIf(Limit > 0, "TOP " & Limit & " ", "") & _
            ConcatColumns & " " & _
        "FROM " & Tbl & " " & _
        IIf(Criteria <> "", "WHERE " & Criteria & " ", "") & _
        IIf(Sort <> "", "ORDER BY " & Sort, "")
    ' Open the recordset and loop through it:
    ' 1) Concatenate each column in each row of the recordset
    ' 2) Concatenate the resulting concatenated rows in the function's return value
    Set rs = DBEngine(0)(0).OpenRecordset(SQL, dbOpenForwardOnly)
    With rs
        Do Until .EOF
            ' Initialize variable for this row
            ThisItem = ""
            ' Concatenate columns on this row
            For FieldCounter = 0 To rs.Fields.Count - 1
                ThisItem = ThisItem & Delimiter2 & Nz(rs.Fields(FieldCounter).Value, "")
            ' Trim leading delimiter
            ThisItem = Mid(ThisItem, Len(Delimiter2) + 1)
            ' Concatenate row result to function return value
            DConcat = Nz(DConcat, "") & Delimiter1 & ThisItem
    End With
    ' Trim leading delimiter
    If Not IsNull(DConcat) Then DConcat = Mid(DConcat, Len(Delimiter1) + 1)
    GoTo Cleanup

    ' Error is most likely an invalid database object name, or bad syntax in the Criteria
    DConcat = CVErr(Err.Number)
    Set rs = Nothing
End Function

Open in new window

Then use it in a query like this:

SELECT SKU, EXPORT_ME, DConcat("[COUNTRY_CODE]", "[tbl_name]", "[SKU] = '" & SKU & "' And [EXPORT_ME] = '" & EXPORT_ME & "'", "; ") AS Country_Codes
FROM tbl_name

Open in new window

Rey Obrero (Capricorn1)Commented:
place this code in a regular module

Function ConcatThem(xVar As String)
  Dim rs As DAO.Recordset, sql As String, strCombine As String
  sql = "Select Country_Code From TableX Where SKU ='" & xVar & "' And COUNTRY_CODE Is not Null"
  Set rs = CurrentDb.OpenRecordset(sql)
  Do Until rs.EOF
      strCombine = strCombine & ";" & rs!Country_Code

  ConcatThem = Mid(strCombine, 2)

  End Function

then create a query like this

select SKU, EXPORT_ME, concatthem([SKU]) as  CountryCode
from tableX
group by SKU, EXPORT_ME, concatthem([SKU])
FordraidersAuthor Commented:
checking these out...Thanks !
FordraidersAuthor Commented:
rey, I have checked and double checked your routine.
It is just taking over an hour to return data.

Patrick, working very quickly.
FordraidersAuthor Commented:
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.