简体   繁体   English

SQL 按行号顺序连接字符串

[英]SQL Concatenate Strings in order of line numbers

I am using SQL Server 2014 Standard.我正在使用 SQL Server 2014 标准版。

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:我需要一种方法来通过 ach.amt 行获取此信息,并连接 ades.des 信息以获得类似于以下的结果:

+------------+--------------------------------------------------------------------------------------------------+
|   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:这就是string_agg()的作用:

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:如果没有 STRING_AGG,您将使用 XML PATH 如下所示:

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.这可能不是最漂亮的解决方案,但我不得不处理类似的事情并使用 cursor 将我的字符串连接到一个临时表中,然后在我的最终连接语句中使用它返回到原始表。 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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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