简体   繁体   中英

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.                                                                         |
+------------+--------------------------------------------------------------------------------------------------+

This is what string_agg() does:

select ach.amt,
       string_agg(des, ',') within group (order by dsline)
from t
group by ach.amt;

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

This may not be the prettiest solution but I have had to deal with something similar and used a cursor to concatenate my strings in a temporary table and then used that in my final join statement back to the original table. I used table variables so you can play with it yourself.

Following is a code example you can play with:

declare @tableAmt table (
IDNum int,
Amt Money
)

declare @tableDesc table (
IDNum int,
LineNum int,
Info varchar(10)
)

set nocount on

insert @tableAmt (IDNum, Amt)
values (1,100.00),
(2,125.00)

insert @tableDesc (IDNum, LineNum, Info)
values (1,1,'some text'),
(1,2,'more text'),
(2,1,'different'),
(2,2,'text'),
(2,3,'final')

declare @description table 
   (IDNum int,
   ConcatDesc varchar(30)
    )


declare @id int,
        @oldid int,
        @string char(10),
        @finalstring varchar(30)

    declare getdata_cursor cursor for
        select IDNum, Info 
        from @tableDesc 
        order by IDNum, LineNum

        open getdata_cursor

        fetch next from getdata_cursor into
        @id, @string
    
        while @@FETCH_STATUS=0
        begin
            
            if @oldid <> @id
                begin 
                    insert @description(IDNum, ConcatDesc)
                    values(@oldid, @finalstring)
                    select @finalstring = ''
                end
        
            select @finalstring = isnull(@finalstring,'') + rtrim(@string) + ' '
        



        select @string = '', @oldid = @id 
    
            fetch next from getdata_cursor into
            @id, @string

        

        end

        insert @description(IDNum, ConcatDesc)
                    values(@oldid, @finalstring)

    close getdata_cursor
    deallocate getdata_cursor


    select ta.IDNum, Amt, ConcatDesc from @tableAmt ta join @description d
    on  ta.IDNum = d.IDNum

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM