Search code examples
sqlsql-servert-sqlsql-server-2014string-concatenation

SQL Concatenate Strings in order of line numbers


I am using SQL Server 2014 Standard.

I have the following query...

SELECT ach.amt, ades.dsline, ades.des
FROM   ##ACHTrans ach
LEFT OUTER JOIN apvodes ades on 1=1 and ades.vo_id = ach.vo_id 
WHERE   ades.voline = '100'
ORDER by ach.apnum, ach.cknum, ach.vo_id, ach.amt desc

Which gives me the results...

+------------+---------------+------------------------------+
|   ach.amt  |  ades.dsline  |          ades.des            |
+------------+---------------+------------------------------+
|   1232.50  |             1 | This is the description for  |
|   1232.50  |             2 | The $1,232.50 ACH Amount     |
|    245.18  |             1 | This one is for the $245.18  |
|    245.18  |             2 | transactions details         |
|    245.18  |             3 | that has four lines of info  |
|    245.18  |             4 | in the description.          |
|     79.25  |             1 | This $79.25 item has 1 line. |
|     15.00  |             1 | So does this $15.00 one.     |
+------------+---------------+------------------------------+

I need a way to snag this info by the ach.amt line, and concatenate the ades.des info for results similar to:

+------------+--------------------------------------------------------------------------------------------------+
|   Amount   | Description                                                                                      |
+------------+--------------------------------------------------------------------------------------------------+
|   1232.50  | This is the description for The $1,232.50 ACH Amount                                             |
|    245.18  | This one is for the $245.18 transactions details that has four lines of info in the description. |
|     79.25  | This $79.25 item has 1 line.                                                                     |
|     15.00  | So does this $15.00 one.                                                                         |
+------------+--------------------------------------------------------------------------------------------------+

Solution

  • Without STRING_AGG you would use for XML PATH like so:

    DECLARE @table TABLE (amt MONEY, dsline INT, [des] VARCHAR(1000));
    
    INSERT @table VALUES
      (1232.50,1,'This is the description for'),
      (1232.50,2,'The $1,232.50 ACH Amount'),
      ( 245.18,1,'This one is for the $245.18'),
      ( 245.18,2,'transactions details'),
      ( 245.18,3,'that has four lines of info'),
      ( 245.18,4,'in the description.'),
      (  79.25,1,'This $79.25 item has 1 line.'),
      (  15.00,1,'So does this $15.00 one.');
    
    SELECT
      amt,
      [Description] =
    (
      SELECT   t2.[des]+''
      FROM     @table AS t2
      WHERE    t.amt = t2.amt
      ORDER BY t2.dsline
      FOR XML PATH('')
    )
    --       string_agg(des, ',') within group (order by dsline)
    FROM     @table AS t
    GROUP BY amt;
    

    Results:

    amt                   Description
    --------------------- ---------------------------------------------------------------------------------------------
    15.00                 So does this $15.00 one.
    79.25                 This $79.25 item has 1 line.
    245.18                This one is for the $245.18transactions detailsthat has four lines of infoin the description.
    1232.50               This is the description forThe $1,232.50 ACH Amount