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