如何解决SQL按行号顺序连接字符串
我使用的是 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,'This one is for the $245.18'),'transactions details'),3,'that has four lines of info'),4,'in the description.'),( 79.25,'This $79.25 item has 1 line.'),( 15.00,'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
,
这可能不是最漂亮的解决方案,但我不得不处理类似的事情,并使用游标将我的字符串连接到临时表中,然后在我的最终连接语句中使用它回到原始表。我使用了表变量,所以你可以自己玩。
以下是您可以使用的代码示例:
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,'some text'),(1,'more text'),'different'),'text'),'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,@finalstring)
close getdata_cursor
deallocate getdata_cursor
select ta.IDNum,Amt,ConcatDesc from @tableAmt ta join @description d
on ta.IDNum = d.IDNum
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。