各位老师:在sql中把的tableA表字符串按照分裂成下面组合?(请具体代码,代码对各种个数的id通用,立马采纳!)

2025-03-24 03:14:05
推荐回答(1个)
回答1:

--基本思路:用二进制对应字符串组合,例如aaa,ccc,ddddd对应0x01101,即十进制的13。这样的话所有的字符串组合可以对应到0x00001-0x11111,即1-31
--首先要有一张数字表num,保存从1开始的十进制数。具体构造方法这里不写了,总之表里的数据像这个样子:

--然后就可以用下面的语句查询了:
--生成字符串的所有组合
--测试数据
with tableA (id,keystring) as (
  select 121898, 'aaa' union all
  select 121898, 'bb' union all
  select 121898, 'cccc' union all
  select 121898, 'ddddd' union all
  select 121898, 'e' union all
  select 198567, 'ff' union all
  select 198567, 'ttt' union all
  select 198567, 'z' 
),
t1(id,keystring,seq,num) as (
  select id,keystring
    ,row_number() over (partition by id order by keystring)
    ,(select count(*) from tableA b where a.id=b.id)
  from tableA a
)
--根据n的二进制,取出字符串并聚合
SELECT B.id as id,
STUFF(
COALESCE(
(SELECT  ',' + CAST(keystring AS VARCHAR(max)) AS [text()]
FROM t1 AS O
WHERE id=B.id and B.n & Power(2,O.seq-1) != 0
ORDER BY O.seq
FOR XML PATH(''), TYPE).value('.[1]', 'VARCHAR(MAX)'), ''),1,1,'') AS keystring,
(SELECT count(*) 
FROM t1 AS O1
WHERE id=B.id and B.n & Power(2,O1.seq-1) != 0) AS num
FROM (
  SELECT DISTINCT A.id, C.n
  from num AS C
  INNER JOIN t1 A on C.n) B
ORDER BY id,num,B.n;
--查询结果: