在单个列表中连接每2行

时间:2015-08-12 00:39:52

标签: sql-server concatenation

这是我用来连接前两行的代码,每行各有6个字符。每行数据设置为6.

我的问题是它只返回所需的第一个连接,并且不会影响下一行。

DECLARE @r_strands VARCHAR(MAX)
SET @r_strands=''

SELECT  @r_strands= @r_strands + R_Strands
FROM    rs_table
SELECT  LEFT(@r_strands, +12) AS text

     rs_table

     r_strands 
    thedog 
    wentto 
    hisbed 
    wherei 
    placed 
    foodto 
    eatfor 
    supper

以上是我希望每两行连接的单列表的示例

EX. result desired

 r_strands 
 thedogwentto 
 hisbedwherei 
 placedfoodto 
 eatforsupper

3 个答案:

答案 0 :(得分:1)

您可以使用ROW_NUMBER成对连续两个r_strands。然后使用FOR XML PATH('')进行连接:

如果您有Id来确定订单,则可以将ORDER BY替换为Id而不是SELECT NULL

SQL Fiddle

;WITH Cte AS(
    SELECT *,
        RN = (ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) + 1) / 2
    FROM rs_table
)
SELECT
    r_strands = (
        SELECT '' + r_strands
        FROM Cte
        WHERE RN = c.RN
        FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'
    )
FROM Cte c
GROUP BY RN

<强> RESULT

|    r_strands |
|--------------|
| thedogwentto |
| hisbedwherei |
| placedfoodto |
| eatforsupper |

答案 1 :(得分:0)

假设您有一个行号列(称之为&#34; id&#34;),您可以自己加入id上的相邻列,并使用+ string concatination运算符连接字符串:

free()

答案 2 :(得分:0)

declare @t table (id int, r_strands varchar(100));
insert into @t values
(1, 'thedog'), 
(2, 'wentto'), 
(3, 'hisbed'), 
(4, 'wherei'), 
(5, 'placed'), 
(6, 'foodto'), 
(7, 'eatfor'), 
(8, 'supper');

select r_strands + next_row
from
(
    select *,
           next_row =  lead(r_strands) over(order by id),
           is_mod   = id % 2
    from @t
) x
where is_mod != 0;