【问题标题】:Generating row/columns for individual chars using CTE使用 CTE 为单个字符生成行/列
【发布时间】:2011-06-20 06:06:45
【问题描述】:

我有下面的输入表

Input

ID  Row Data
1   1   a2b
1   2   p1d1
2   1   abcd

预期输出

ID  RowCol  Chars
1   a1  a
1   b1  X
1   c1  X
1   d1  b
1   a2  p
1   b2  X
1   c2  d
1   d2  X
2   a1  a
2   b1  b
2   c1  c
2   d1  d

数据列中的每个数字都将被视为多个 X。因此,如果扩展第一个资源,即“a2b” 它变成aXXB。也就是说长度为 4。在列中表示它将是 a、b、c 和 d。 而且由于它在第一行,因此,输出将是

ID  RowCol  Chars
1   a1  a
1   b1  X
1   c1  X
1   d1  b

ddl如下

Declare @t table(ID int , Row int, Data varchar(10))
Insert into @t 
Select 1, 1,'a2b' Union All Select 1,2,'p1d1' Union All Select 2,1,'abcd'

寻找基于 cte 的解决方案。

提前致谢

【问题讨论】:

  • 你已经问过同样的问题了。
  • 你应该试试我的代码的新版本,我花了很多时间。它有效,但是我正在考虑明天的改进。

标签: sql-server sql-server-2005 tsql common-table-expression


【解决方案1】:

正如我所承诺的,我今天会做出更好的解决方案。我知道你会喜欢并且很可能会使用它。

DECLARE @t TABLE(ID INT , Row INT, Data VARCHAR(10)) 
Insert INTO @t  
SELECT 1, 1,'a2b' UNION All SELECT 1,2,'p1d1' UNION All SELECT 2,1,'abcd'

;WITH cte(id, row, num, data) 
AS ( 
SELECT id, row, 1 num,CAST(data as VARCHAR(10)) data
FROM @t
UNION ALL 
SELECT ch.id, row, CH.num +1,  CAST(REPLACE(ch.data, ch.num, REPLICATE('X', ch.num)) as VARCHAR(10))
FROM cte ch
WHERE ch.num < 9 )
, cte2(id, rowcol, row, num, data, chars, LEVEL)  as
(SELECT  id, CHAR(97) + CAST(row AS CHAR) rowcol, row, num, data, SUBSTRING(data, 1, 1), 1 LEVEL
FROM cte 
where num =  9
UNION all
SELECT id, CHAR(97 + LEVEL) + CAST(row AS CHAR) rowcol, row, num, data, SUBSTRING(data, LEVEL + 1, 1), LEVEL + 1
FROM cte2 ch
where LEVEL < LEN(data)
)
SELECT ID, rowcol, chars 
FROM CTE2
ORDER BY id, data, rowcol

【讨论】:

    猜你喜欢
    • 2019-11-20
    • 2017-11-12
    • 2022-10-05
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    • 2020-03-11
    • 1970-01-01
    • 2013-02-01
    相关资源
    最近更新 更多