簡體   English   中英

SQL 按行號順序連接字符串

[英]SQL Concatenate Strings in order of line numbers

我正在使用 SQL Server 2014 標准版。

我有以下查詢...

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

這給了我結果......

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

我需要一種方法來通過 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.                                                                         |
+------------+--------------------------------------------------------------------------------------------------+

這就是string_agg()的作用:

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

如果沒有 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;

結果:

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

這可能不是最漂亮的解決方案,但我不得不處理類似的事情並使用 cursor 將我的字符串連接到一個臨時表中,然后在我的最終連接語句中使用它返回到原始表。 我使用了表變量,所以你可以自己玩。

以下是您可以使用的代碼示例:

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