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和我想象中的东西来耍花招