Solved

How to combine query results from multiple records in one field

Posted on 2009-05-11
5
217 Views
Last Modified: 2012-05-06
I have two tables that I query, a LINE and a RUN table, related by keytags and I can have multiple RUN records for each LINE. My current query returns results like this:
LINE.name1, RUN.name1, RUN.ins1
LINE.name1, RUN.name2, RUN.ins2
LINE.name1, RUN.name3, RUN.ins3
LINE.name2, RUN.name1, RUN.ins1

I would like to get the results in this form though (one line per LINE record):
LINE.name1, [RUN.ins1 & RUN.ins2 & RUN.ins3]
LINE.name2, RUN.ins1

What do I have to add to my query to get this (which is currently just a simple select on the left join between LINE and RUN tables)?
Thanks!
0
Comment
Question by:PopoDi
  • 3
  • 2
5 Comments
 

Author Comment

by:PopoDi
ID: 24359586
I should explain that I need the one-line results above for the report.
0
 
LVL 41

Expert Comment

by:ralmada
ID: 24359645
0
 

Author Comment

by:PopoDi
ID: 24366388
Hi ralmada,

I found fConcatFld function that seems to fit what I need more than the solution you linked to (I'm beginner in this so my judgement may be wrong), however I do have one problem with it. I'd like to return "none" if my ins field is null  (I cannot write it in the database because it is linked to another program and needs to stay null) and it seems that in some cases fConcatFld returns extra results. Most of them are correct, but in one case I have this:
Line Name      Run Ins
1402               null; null; 2hg; 2hg

and the fConcatFld return this:
Line Name      Run Ins
1402               2hg; 2hg; 2hg; 2hg; 2hg; ;

Included is the code for fConcatFld that I am using. Maybe I should repost this as a separate question.
'************ Code Start *********

'This code was originally written by Dev Ashish

'It is not to be altered or distributed,

'except as part of an application.

'You are free to use it in any application,

'provided the copyright notice is left unchanged.

'

'Code Courtesy of

'Dev Ashish

'

Public Function fConcatFld(stTable As String, _

                    stForFld As String, _

                    stFldToConcat As String, _

                    stForFldType As String, _

                    vForFldVal As Variant) _

                    As String

'Returns mutiple field values for each unique value

'of another field in a single table

'in a semi-colon separated format.

'

'Usage Examples:

'   ?fConcatFld(("Customers","ContactTitle","CustomerID", _

'                "string","Owner")

'Where  Customers     = The parent Table

'       ContactTitle  = The field whose values to use for lookups

'       CustomerID    = Field name to concatenate

'       string        = DataType of ContactTitle field

'       Owner         = Value on which to return concatenated CustomerID

'

Dim lodb As DAO.Database, lors As DAO.Recordset

Dim lovConcat As Variant, loCriteria As String

Dim loSQL As String

Const cQ = """"
 

    On Error GoTo Err_fConcatFld

    

    lovConcat = Null

    Set lodb = CurrentDb

    

    loSQL = "SELECT [" & stFldToConcat & "] FROM ["

    loSQL = loSQL & stTable & "] WHERE "

    

    Select Case stForFldType

        Case "String":

            loSQL = loSQL & "[" & stForFld & "] =" & cQ & vForFldVal & cQ

        Case "Long", "Integer", "Double":    'AutoNumber is Type Long

            loSQL = loSQL & "[" & stForFld & "] = " & vForFldVal

        Case Else

            GoTo Err_fConcatFld

    End Select

    

    loSQL = loSQL & " ORDER BY [" & stFldToConcat & "]"

    Set lors = lodb.OpenRecordset(loSQL, dbOpenSnapshot)

    

    'Are we sure that duplicates exist in stFldToConcat

    With lors

        If .RecordCount <> 0 Then

        .MoveFirst

            'start concatenating records

            Do While Not .EOF

                lovConcat = lovConcat & lors(stFldToConcat) & "; "

                .MoveNext

            Loop

        Else

            GoTo Exit_fConcatFld

        End If

    End With

        

    'That's it... you should have a concatenated string now

    'Just Trim the trailing ;

    fConcatFld = Left(lovConcat, Len(lovConcat) - 2)
 
 

Exit_fConcatFld:

    Set lors = Nothing: Set lodb = Nothing

    Exit Function
 

Err_fConcatFld:

    MsgBox "Error#: " & Err.Number & vbCrLf & Err.Description

    Resume Exit_fConcatFld

End Function

'************ Code End **********

Open in new window

0
 
LVL 41

Accepted Solution

by:
ralmada earned 500 total points
ID: 24374920
Hi,
I've modified your function a bit. Let me know if this is what you're looking for.

'************ Code Start *********

'This code was originally written by Dev Ashish

'It is not to be altered or distributed,

'except as part of an application.

'You are free to use it in any application,

'provided the copyright notice is left unchanged.

'

'Code Courtesy of

'Dev Ashish

'

Public Function fConcatFld(stTable As String, _

                    stForFld As String, _

                    stFldToConcat As String, _

                    stForFldType As String, _

                    vForFldVal As Variant) _

                    As String

'Returns mutiple field values for each unique value

'of another field in a single table

'in a semi-colon separated format.

'

'Usage Examples:

'   ?fConcatFld(("Customers","ContactTitle","CustomerID", _

'                "string","Owner")

'Where  Customers     = The parent Table

'       ContactTitle  = The field whose values to use for lookups

'       CustomerID    = Field name to concatenate

'       string        = DataType of ContactTitle field

'       Owner         = Value on which to return concatenated CustomerID

'

Dim lodb As DAO.Database, lors As DAO.Recordset

Dim lovConcat As Variant, loCriteria As String

Dim loSQL As String

Const cQ = """"

 

    On Error GoTo Err_fConcatFld

    

    lovConcat = Null

    Set lodb = CurrentDb

    

    loSQL = "SELECT [" & stFldToConcat & "] FROM ["

    loSQL = loSQL & stTable & "] WHERE "

    

    Select Case stForFldType

        Case "String":

            loSQL = loSQL & "[" & stForFld & "] =" & cQ & vForFldVal & cQ

        Case "Long", "Integer", "Double":    'AutoNumber is Type Long

            loSQL = loSQL & "[" & stForFld & "] = " & vForFldVal

        Case Else

            GoTo Err_fConcatFld

    End Select

    

    loSQL = loSQL & " ORDER BY [" & stFldToConcat & "]"

    Set lors = lodb.OpenRecordset(loSQL, dbOpenSnapshot)

    

    'Are we sure that duplicates exist in stFldToConcat

    With lors

        If .RecordCount <> 0 Then

        .MoveFirst

            'start concatenating records

            Do While Not .EOF

                If IsNull(lors(stFldToConcat)) Then

                    lovConcat = lovConcat & "none" & "; "

                Else

                    lovConcat = lovConcat & lors(stFldToConcat) & "; "

                End If

                .MoveNext

            Loop

        Else

            GoTo Exit_fConcatFld

        End If

    End With

        

    'That's it... you should have a concatenated string now

    'Just Trim the trailing ;

    fConcatFld = Left(lovConcat, Len(lovConcat) - 2)

 

 

Exit_fConcatFld:

    Set lors = Nothing: Set lodb = Nothing

    Exit Function

 

Err_fConcatFld:

    MsgBox "Error#: " & Err.Number & vbCrLf & Err.Description

    Resume Exit_fConcatFld

End Function

'************ Code End **********

Open in new window

0
 

Author Closing Comment

by:PopoDi
ID: 31580338
Thanks!
0

Featured Post

DevOps Toolchain Recommendations

Read this Gartner Research Note and discover how your IT organization can automate and optimize DevOps processes using a toolchain architecture.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

As they say in love and is true in SQL: you can sum some Data some of the time, but you can't always aggregate all Data all the time! Introduction: By the end of this Article it is my intention to bring the meaning and value of the above quote to…
If you find yourself in this situation “I have used SELECT DISTINCT but I’m getting duplicates” then I'm sorry to say you are using the wrong SQL technique as it only does one thing which is: produces whole rows that are unique. If the results you a…
This Micro Tutorial will give you a basic overview how to record your screen with Microsoft Expression Encoder. This program is still free and open for the public to download. This will be demonstrated using Microsoft Expression Encoder 4.
This Micro Tutorial hows how you can integrate  Mac OSX to a Windows Active Directory Domain. Apple has made it easy to allow users to bind their macs to a windows domain with relative ease. The following video show how to bind OSX Mavericks to …

920 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

16 Experts available now in Live!

Get 1:1 Help Now