[英]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.