【问题标题】:SQL Concatenate Strings in order of line numbersSQL 按行号顺序连接字符串
【发布时间】:2021-05-29 01:32:34
【问题描述】:

我使用的是 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.                                                                         |
+------------+--------------------------------------------------------------------------------------------------+

【问题讨论】:

  • on 1=1? 1何时等于1
  • amt 可能是唯一的吗?如果不是,准确地定义您的不同组吗​​?
  • @Larnu 当您在客户端代码中构建查询并且 where 子句由用户选择确定时,这很常见。以WHERE 1=1 开头允许每个用户选择相同的AND {cirteria} 表达式。
  • 我会在WHERE 中理解这一点(尽管我不是他们的粉丝),但在ON 子句中,@JoelCoehoorn ?用户何时定义JOIN 条件?
  • @Larnu 我在一些报告工具中看到过。

标签: sql sql-server tsql sql-server-2014 string-concatenation


【解决方案1】:

string_agg() 就是这样做的:

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

【讨论】:

  • 获取:消息 10757,级别 15,状态 1,第 46 行函数“string_agg”可能没有 WITHIN GROUP 子句。这是 SQL Server 2014。
  • @NCollinsTE 如果您无法访问 Sql Server 2017,这将需要旧的痛苦 FOR XML hack。即便如此,这里使用窗口函数也会使其难以复制。
  • @JoelCoehoorn,可悲的是,使用我们拥有的 FMS 软件,我被困在 SQL 2014 上。这是供应商支持的最新版本。我想我得研究一下你所说的这个 FOR XML hack。
【解决方案2】:

如果没有 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

【讨论】:

    【解决方案3】:

    这可能不是最漂亮的解决方案,但我不得不处理类似的事情并使用游标将我的字符串连接到一个临时表中,然后在我的最终连接语句中使用它返回到原始表。我使用了表变量,所以你可以自己玩。

    以下是您可以玩的代码示例:

    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
    

    【讨论】:

      猜你喜欢
      • 2016-04-21
      • 2020-01-01
      • 2016-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-07
      • 1970-01-01
      相关资源
      最近更新 更多