-7

I have this table Table_1 :

pk Column_1
1  addcd
2  swrrh
3  dggdd
4  wdffa

I want to merge and split the result into 4 letters that will return something like this

addc
dswr
rhdg
gddw
dffa

Note: left over letters will be discarded

I tried to use string_agg, but I don't have any idea what to do next.

4

2 回答 2

3

这用于STRING_AGG将字符串聚合成一个长字符串,然后将一个 Tally 表拆分为新行。假设您有一个列要订购。如果你不这样做,你就无法实现你所追求的,因为表中的数据存储在无序堆中。

CREATE TABLE dbo.YourTable (YourID int IDENTITY,
                            Yourcolumn varchar(5));

INSERT INTO dbo.YourTable (Yourcolumn)
VALUES('addcd'),
      ('swrrh'),
      ('dggdd'),
      ('wdffa');
GO

WITH N AS(
    SELECT N
    FROM (VALUES(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL))N(N)),
Tally AS( 
    SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL))-1 AS I
    FROM N N1, N N2, N N3, N N4), --This is likely over kill here, but I've assumed you'll have a much larger data set
Agg AS(
    SELECT STRING_AGG(YT.YourColumn,'') WITHIN GROUP (ORDER BY YT.YourID)   AS YourString
    FROM dbo.YourTable YT)
SELECT SUBSTRING(A.YourString,(I*4)+1,4)
FROM Tally T
     CROSS JOIN Agg A
WHERE SUBSTRING(A.YourString,(I*4)+1,4) <> '';
GO

DROP TABLE dbo.YourTable;

db<>小提琴

于 2019-08-20T07:56:00.020 回答
0

此解决方案适用于旧版本的 SQL Server。Larnu 的回答在最近的版本中是正确的。

让我们使用递归 CTE。这个想法是创建一根大绳子,然后将其切成碎片。多么有趣!

with tt as (
      select t.*, row_number() over (order by pk) as seqnum
      from t
     ),
     bigstring as (
      select convert(varchar(max), column_1) as bigstring, seqnum
      from tt
      union all
      select concat(bigstring.bigstring, tt.column_1), tt.seqnum
      from bigstring join
           tt
           on tt.seqnum = bigstring.seqnum + 1
     ),
     string4 as (
      select top (1) left(bigstring, 4) as string4, stuff(bigstring, 1, 4, '') as rest4, 1 as lev
      from bigstring
      order by len(bigstring.bigstring) desc
      union all
      select left(rest4, 4), stuff(rest4, 1, 4, ''), lev + 1
      from string4
      where rest4 > ''
     )
select string4.string4
from string4
order by lev;

一个查询中有两个递归 CTE!

是一个 db<>fiddle。

于 2019-08-21T01:43:13.447 回答