数据库有列值为如下所示pid        name            groupNo               group_path
11          张三            A0001            d:\学生文档\A0001\11\
12          李四            A0001            d:\学生文档\A0001\12\
13          王五            A0002            d:\学生文档\A0002\13\
14          赵六            B0001            d:\学生文档\B0001\14\
15          小明            B0002            d:\学生文档\B0002\15\
16          aaaa            B0003            d:\学生文档\B0003\16\
17          abab            B0003            d:\学生文档\B0003\17\
18          bbbb            T0001            d:\学生文档\T0001\18\
----------------------------------------------------------------------------
要改成:pid        name            groupNo               group_path
11          张三            00001            d:\学生文档\00001\11\
12          李四            00001            d:\学生文档\00001\12\
13          王五            00002            d:\学生文档\00002\13\
14          赵六            00003            d:\学生文档\00003\14\
15          小明            00004            d:\学生文档\00004\15\
16          aaaa            00005            d:\学生文档\00005\16\
17          abab            00005            d:\学生文档\00005\17\
18          bbbb            00006            d:\学生文档\00006\18\--------------------------------------------------------------------------------------
pid 为主键,  group_path的值为 'd:\学生文档\' + groupNo + pid  要求:
 groupNo前面的字母全部去掉,按照A-Z的字母排序以00001,00002,00003....的顺序重新命名一直往下面排
 从B的开始为A的最大组号+1,如果A最大为A0043,B的第一盘应该改为00044....
 同时后面的group_path中的 groupNo  也要改成相应的组号
 请问这句 SQL怎么写?

解决方案 »

  1.   

    ----------------------------------------------------------------
    -- Author  :fredrickhu(小F,向高手学习)
    -- Date    :2011-05-12 13:21:43
    -- Verstion:
    --      Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86) 
    -- Jul  9 2008 14:43:34 
    -- Copyright (c) 1988-2008 Microsoft Corporation
    -- Enterprise Evaluation Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 3)
    --
    ----------------------------------------------------------------
    --> 测试数据:[tb]
    if object_id('[tb]') is not null drop table [tb]
    go 
    create table [tb]([pid] int,[name] varchar(4),[groupNo] varchar(5),[group_path] varchar(20))
    insert [tb]
    select 11,'张三','A0001','d:\学生文档\A0001\11' union all
    select 12,'李四','A0001','d:\学生文档\A0001\12' union all
    select 13,'王五','A0002','d:\学生文档\A0002\13' union all
    select 14,'赵六','B0001','d:\学生文档\B0001\14' union all
    select 15,'小明','B0002','d:\学生文档\B0002\15' union all
    select 16,'aaaa','B0003','d:\学生文档\B0003\16' union all
    select 17,'abab','B0003','d:\学生文档\B0003\17' union all
    select 18,'bbbb','T0001','d:\学生文档\T0001\18'
    --------------开始查询--------------------------
    --select parsename(REPLACE(group_path,'\','.'),2) from tb
    update
     tb 
    set
     groupNo=RIGHT(groupNo,len(groupNo)-1), 
     group_path=parsename(REPLACE(group_path,'\','.'),4)+'\'+parsename(REPLACE(group_path,'\','.'),3)+'\'+REPLACE(parsename(REPLACE(group_path,'\','.'),2),left(parsename(REPLACE(group_path,'\','.'),2),1),'')+'\'+parsename(REPLACE(group_path,'\','.'),1)select * from tb
    ----------------结果----------------------------
    /* (8 行受影响)(8 行受影响)
    pid         name groupNo group_path
    ----------- ---- ------- --------------------
    11          张三   0001    d:\学生文档\0001\11
    12          李四   0001    d:\学生文档\0001\12
    13          王五   0002    d:\学生文档\0002\13
    14          赵六   0001    d:\学生文档\0001\14
    15          小明   0002    d:\学生文档\0002\15
    16          aaaa 0003    d:\学生文档\0003\16
    17          abab 0003    d:\学生文档\0003\17
    18          bbbb 0001    d:\学生文档\0001\18(8 行受影响)
    */
      

  2.   

    [Quote=引用 1 楼 fredrickhu 的回复:]
      不对噢。.13          王五   0002    d:\学生文档\0002\13
    这条应该是00003了。..不是只单单把前面的字母去掉,我还要按组号不同,重新用00001,000002命名.
      

  3.   


    看见了 更新的时候分下组就可以了 2005可以用ROW_NUMBER()OVER2000可以用IDENTITY
      

  4.   


    select right('0000'+cast(DENSE_RANK() over(order by groupno) as varchar(5)),5) as groupno from tb