SQL 按行号顺序连接字符串
SQL Concatenate Strings in order of line numbers
我正在使用 SQL Server 2014 Standard。
我有以下查询...
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 ,232.50 ACH Amount |
| 245.18 | 1 | This one is for the 5.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 .25 item has 1 line. |
| 15.00 | 1 | So does this .00 one. |
+------------+---------------+------------------------------+
我需要一种方法来通过 ach.amt 行获取此信息,并连接 ades.des 信息以获得类似于:
的结果
+------------+--------------------------------------------------------------------------------------------------+
| Amount | Description |
+------------+--------------------------------------------------------------------------------------------------+
| 1232.50 | This is the description for The ,232.50 ACH Amount |
| 245.18 | This one is for the 5.18 transactions details that has four lines of info in the description. |
| 79.25 | This .25 item has 1 line. |
| 15.00 | So does this .00 one. |
+------------+--------------------------------------------------------------------------------------------------+
这就是 string_agg()
的作用:
select ach.amt,
string_agg(des, ',') within group (order by dsline)
from t
group by ach.amt;
这可能不是最漂亮的解决方案,但我不得不处理类似的事情并使用游标在临时 table 中连接我的字符串,然后在我的最终连接语句中使用它回到原来的状态table。我使用了 table 个变量,所以你可以自己玩。
以下是您可以玩的代码示例:
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
如果没有 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 ,232.50 ACH Amount'),
( 245.18,1,'This one is for the 5.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 .25 item has 1 line.'),
( 15.00,1,'So does this .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 .00 one.
79.25 This .25 item has 1 line.
245.18 This one is for the 5.18transactions detailsthat has four lines of infoin the description.
1232.50 This is the description forThe ,232.50 ACH Amount
我正在使用 SQL Server 2014 Standard。
我有以下查询...
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 ,232.50 ACH Amount |
| 245.18 | 1 | This one is for the 5.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 .25 item has 1 line. |
| 15.00 | 1 | So does this .00 one. |
+------------+---------------+------------------------------+
我需要一种方法来通过 ach.amt 行获取此信息,并连接 ades.des 信息以获得类似于:
的结果+------------+--------------------------------------------------------------------------------------------------+
| Amount | Description |
+------------+--------------------------------------------------------------------------------------------------+
| 1232.50 | This is the description for The ,232.50 ACH Amount |
| 245.18 | This one is for the 5.18 transactions details that has four lines of info in the description. |
| 79.25 | This .25 item has 1 line. |
| 15.00 | So does this .00 one. |
+------------+--------------------------------------------------------------------------------------------------+
这就是 string_agg()
的作用:
select ach.amt,
string_agg(des, ',') within group (order by dsline)
from t
group by ach.amt;
这可能不是最漂亮的解决方案,但我不得不处理类似的事情并使用游标在临时 table 中连接我的字符串,然后在我的最终连接语句中使用它回到原来的状态table。我使用了 table 个变量,所以你可以自己玩。
以下是您可以玩的代码示例:
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
如果没有 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 ,232.50 ACH Amount'),
( 245.18,1,'This one is for the 5.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 .25 item has 1 line.'),
( 15.00,1,'So does this .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 .00 one.
79.25 This .25 item has 1 line.
245.18 This one is for the 5.18transactions detailsthat has four lines of infoin the description.
1232.50 This is the description forThe ,232.50 ACH Amount