Sql server 字符串的Concat变量
我有一张这样的桌子:Sql server 字符串的Concat变量,sql-server,ssms,Sql Server,Ssms,我有一张这样的桌子: Names uniqueid crosby,stills,nash 1 crosby,stills,nash,young 2 crosby 3 stills 4 nash 5 young 6 我将其拆分为:
Names uniqueid
crosby,stills,nash 1
crosby,stills,nash,young 2
crosby 3
stills 4
nash 5
young 6
我将其拆分为:
Names uniqueid name
crosby,stills,nash 1 crosby
crosby,stills,nash 1 stills
crosby,stills,nash 1 nash
crosby,stills,nash,young 2 crosby
crosby,stills,nash,young 2 stills
crosby,stills,nash,young 2 nash
crosby,stills,nash,young 2 young
crosby 3 crosby
stills 4 stills
nash 5 nash
young 6 young
我想要的是:
Namecombos count
crosby 3
stills 3
nash 3
young 2
crosby,stills 2
stills,nash 2
nash,young 1
crosby,stills,nash 2
stills,nash,young 1
crosby,stills,nash,young 1
我想做的是找到名字的独特组合。克罗斯比、斯蒂尔斯、纳什、杨有10种独特的组合:
克罗斯比
剧照
纳什
年轻的
克罗斯比,剧照
剧照,纳什
纳什,杨
克罗斯比,剧照,纳什
剧照,纳什,杨,
克罗斯比,斯蒂尔斯,纳什,杨
秩序很重要
只需将其解析为唯一的组合,然后计算出有多少个结果
希望这是有道理的。哇,这让我的大脑崩溃(痛苦)。我不是专业人士,所以如果有人想美化我所做的,请做,我会接受你的回答
但这是最难的部分,那就是创造独特的组合。计算它们应该是容易的部分
注意:我从原始的逗号分隔值开始,而不是中间表
CREATE FUNCTION [dbo].[func_Split]
(
@OrigStr varchar(8000),
@Delimiter varchar(100)
)
RETURNS @tblArray TABLE
(
ElementID int IDENTITY(1,1), -- Array index
Element varchar(1000) -- Array element contents
)
AS
BEGIN
-- Local Variable Declarations
-- ---------------------------
DECLARE @Index1 smallint,
@Index2 smallint,
@incr smallint,
@OuterLoop smallint,
@n smallint,
@LastDelim smallint
SET @n = LEN(@OrigStr) - LEN(REPLACE(@OrigStr, ',', ''))
SET @OuterLoop = 1
SET @LastDelim = LEN(@OrigStr) + 1 - CHARINDEX(@Delimiter,REVERSE(@OrigStr))
WHILE @OuterLoop <= @n+1
BEGIN
SET @Index1 = 1
SET @Index2 = @Index1
WHILE @Index2 < LEN(@OrigStr)
BEGIN
SET @Index2 = @Index1
SET @incr = 1
WHILE @incr <= @OuterLoop
BEGIN
SET @Index2 = CHARINDEX(@Delimiter,@OrigStr,@Index2+1)
IF @Index2 = 0 BEGIN SET @Index2 = LEN(@OrigStr) END
SET @incr = @incr + 1
END
IF @Index2 = LEN(@OrigStr)
BEGIN
INSERT INTO
@tblArray
(Element)
VALUES
(LTRIM(RTRIM(SUBSTRING(@OrigStr,@Index1,@Index2-@Index1+1))))
END
ELSE
BEGIN
INSERT INTO
@tblArray
(Element)
VALUES
(LTRIM(RTRIM(SUBSTRING(@OrigStr,@Index1,@Index2-@Index1))))
END
SET @Index1 = CHARINDEX(@Delimiter,@OrigStr,@Index1+1)+1
END
SET @OuterLoop = @OuterLoop + 1
END
RETURN
END
创建函数[dbo].[func\u Split]
(
@OrigStr varchar(8000),
@分隔符varchar(100)
)
返回@tblArray表
(
ElementID int-IDENTITY(1,1),--数组索引
元素varchar(1000)——数组元素内容
)
作为
开始
--局部变量声明
-- ---------------------------
声明@Index1 smallint,
@Index2 smallint,
@增量smallint,
@外环smallint,
@n smallint,
@拉斯特利姆斯莫林酒店
设置@n=LEN(@OrigStr)-LEN(替换(@OrigStr,,,,))
设置@OuterLoop=1
设置@LastDelim=LEN(@OrigStr)+1-CHARINDEX(@Delimiter,REVERSE(@OrigStr))
尽管@OuterLoop会像示例数据中的情况一样,为名称的每个唯一单个实例始终存在一行,或者可能存在这样的情况,例如,Nash仅在元组中,而从不单独存在?第二个是正确的。我想我正在使用一个自定义函数,如果可以的话,我会发布解决方案。很容易得到所有可能的组合,但不能得到唯一的有序组合。i、 e.所有组合的克罗斯比、斯蒂尔斯、纳什|克罗斯比、纳什、斯蒂尔斯|斯蒂尔斯、纳什、克罗斯比等。将这些等同于1是困难的部分。用递归cte和我想象中的东西来耍花招