我现在有
A 表 id type
 123 12;34
 124 12;34;23
 126 23
 227 24结果是下面这样的
B 表
 id type groups
 123 12 0
 123 34 1   
 124 12 0
 124 34 1
 124 23 2
 126 23 0
 227 24 0
 ........
........请帮忙解决一下。
数万量级的数据,主要是这么把这些数据拆分后使groups字段从0递增,因为type是不确定的。

解决方案 »

  1.   

    只针对自增
    --> 生成测试数据表: [tb]
    IF OBJECT_ID('[tb]') IS NOT NULL
        DROP TABLE [tb]
    GO
    CREATE TABLE [tb] ([col1] [nvarchar](10),[col2] [int])
    INSERT INTO [tb]
    SELECT 'a','1' UNION ALL
    SELECT 'a','2' UNION ALL
    SELECT 'b','1' UNION ALL
    SELECT 'b','2' UNION ALL
    SELECT 'b','3'
    -->SQL查询如下:
    SELECT rn = ROW_NUMBER()OVER(ORDER BY GETDATE()), col1, SUM(col2) col2 
    FROM tb
    GROUP BY col1
    /*
    rn                   col1       col2
    -------------------- ---------- -----------
    1                    a          3
    2                    b          6(2 行受影响)
    */--2kSELECT rn = IDENTITY(INT), col1, SUM(col2) col2 INTO #
    FROM tb
    GROUP BY col1
    SELECT * FROM #
    DROP TABLE #
    /*
    rn                   col1       col2
    -------------------- ---------- -----------
    1                    a          3
    2                    b          6(2 行受影响)
    */
      

  2.   

    if OBJECT_ID('f_split','tf') is not null
        drop function f_split
    go
    create function f_split(@Input varchar(2000),@split varchar(10))
    returns @re table(id int identity,strs varchar(20))
    begin
        declare @index int
        while charindex(@split,@Input)>0
        begin
            set @index=charindex(@split,@Input)
            insert into @re values(left(@Input,@index-1))
            set @Input=right(@Input,len(@Input)-@index)
        end
        if len(@Input)>0
            insert into @re values(@Input)
        return
    end
    goselect a.id,b.strs as type,b.id-1 as groups from tb a
    cross apply f_split(a.type,';') b
      

  3.   

    --> 生成测试数据表: [tb]
    IF OBJECT_ID('[tb]') IS NOT NULL
    DROP TABLE [tb]
    GO
    CREATE TABLE [tb] ([id] [int],[type] [nvarchar](10))
    INSERT INTO [tb]
    SELECT '123','12;34' UNION ALL
    SELECT '124','12;34;23' UNION ALL
    SELECT '126','23' UNION ALL
    SELECT '227','24'-->SQL查询如下:SELECT a.id, b.[type], groups 
    FROM (
             SELECT id, [type] = CONVERT(XML, '<v>'+REPLACE([type], ';', '</v><v>')+'</v>') 
             FROM tb
         ) a
    OUTER APPLY(
    SELECT [type] = n.v.value('.', 'varchar(10)'), groups = ROW_NUMBER()OVER(ORDER BY @@spid)-1 
    FROM a.[type].nodes('/v') n(v)
    ) b
    /*
    id          type       groups
    ----------- ---------- --------------------
    123         12         0
    123         34         1
    124         12         0
    124         34         1
    124         23         2
    126         23         0
    227         24         0(7 行受影响)
    */
      

  4.   


    在关键字 'OUTER' 附近有语法错误。
    'ROW_NUMBER' 不是可以识别的 函数名。
      

  5.   

    汗,楼主一开始就要说明数据库版本:参考通用拆分函数:http://blog.csdn.net/htl258/archive/2010/04/29/5537235.aspx