--我有一张表tax,数据约有2000万条,有以下字段
--ID int 递增,主键
--纳税人内部码 varchar(50), 指的是纳税的单位对应的纳税ID 
--纳税个人内部码 varchar(50),指的是纳税个人对应的纳税ID
--代扣代缴单位 varchar(200), 指的是纳税的单位名称
--通讯地址 varchar(200),    指的是纳税的单位的通讯地址
--地市名称 varchar(20),     指纳税单位或个人所在的城市
--station varchar(8),        指的是通讯地址所属的站,8位数字组成,也有null值存在
--sect varchar(3),          指的是通讯地址所属的段,1-3位数组成,也有null值存在,不足3位前面没有补位--countnumber int,           指的是数据中同一 纳税人内部码 且 同一通讯地址的记录条数
--信息编码 varchar(50),     信息编码是按业务需求规则定制的,它由 station + '-' + 'sect + '-' + 纳税人内部码 + 流水号
                             其中,流水号为 1至countnumber的最大值,流水号为固定6位,不足6位的前面补0--其中,countnumber、信息编码 2个字段是手工新增的,要求先填充数据,再排序数据
--要求用SQL实现:
--1、按countnumber字段要求统计出数值填充到countnumber字段中;
--2、按信息编码字段要求填充到信息编码字段中;
--3、排序数据,按station,sect,countnumber desc,纳税人内部码,代扣代缴单位  来排序

解决方案 »

  1.   

    --信息编码 varchar(50),     信息编码是按业务需求规则定制的,它由 station + '-' + 'sect + '-' + 纳税人内部码 + '-' + 流水号
                                 其中,流水号为 1至countnumber的最大值,流水号为固定6位,不足6位的前面补0
    流水号前少了个'-'
      

  2.   

    忘了一点很重要的,凡是字段中有null值的要排在有值的后面
      

  3.   

    --1、按countnumber字段要求统计出数值填充到countnumber字段中;
    update tax set countnumber = (select count(1) from tax where 纳税人内部码 = t.纳税人内部码 and 通讯地址 = t.通讯地址) from tax t--2、按信息编码字段要求填充到信息编码字段中;
    update tax set 信息编码 = isnull(station,'') + '-' + isnull(sect,'') + '-' + 纳税人内部码 + right('00000'+cast(countnumber as varchar),6)--3、排序数据,按station,sect,countnumber desc,纳税人内部码,代扣代缴单位  来排序
    select * from tax order by station,sect,countnumber desc,纳税人内部码,代扣代缴单位
      

  4.   

    --1、按countnumber字段要求统计出数值填充到countnumber字段中;
    update tax set countnumber = (select count(1) from tax where 纳税人内部码 = t.纳税人内部码 and 通讯地址 = t.通讯地址) from tax t--2、按信息编码字段要求填充到信息编码字段中;
    update tax set 信息编码 = isnull(station,'') + '-' + isnull(sect,'') + '-' + 纳税人内部码 + '-' + right('00000'+cast(countnumber as varchar),6)--3、排序数据,按station,sect,countnumber desc,纳税人内部码,代扣代缴单位 来排序
    select * from tax order by station,sect,countnumber desc,纳税人内部码,代扣代缴单位
      

  5.   

    在排序方面,station,sect2个字段实际有些是null值,如果就这样order by station,sect的话
    一般null值会排在最前面的,我现在想把这些null值排在有数值的最后面。例如:
    station   sect
    1           1
    1           null
    2           1
    2           11
    3           2
    3           5
    1           6
    null        3
    null        null排完序后应该这样station   sect
    1  1
    1  6
    1  null
    2  1
    2  11
    3  2
    3  5
    3  6
    null  3
    null  null
      

  6.   

    关于信息编码中的流水号,是我错了,我没有说清楚假设有以下数据:则它的信息编码的流水号应为最右列
    ID  纳税人内部码  代扣代缴单位  通讯地址     station sect countnumber     流水号
    1     001           aaa      adress1        1      1      3902       000001
    2     001           aaa      adress1        1      1      3902       000002
    3     001           aaa      adress1        1      1      3902       000003
    4     001           aaa      adress1        1      1      3902       000004
    ....一直至3902条                                                              003902
    3903  002           bbb      address2       2      1       255       000001
    3904  002           bbb      address2       2      1       255       000002
    3905  002           bbb      address2       2      1       255       000003
    3906  002           bbb      address2       2      1       255       000004
    ...一直至3902+255条注意:不能用ID作为参考来编流水号,上面的ID只是举例。请问上面的信息编码中的流水号该如何编?--2、按信息编码字段要求填充到信息编码字段中;
    update tax set 信息编码 = isnull(station,'') + '-' + isnull(sect,'') + '-' + 纳税人内部码 + '-' + right('00000'+cast(countnumber as varchar),6)
      

  7.   

    固定补几位0是不对的吧,应该是用100000+countnumber的值 ,然后取它右边的6位数字
      

  8.   

    select * from #tb order by isnull([station],2147483647),isnull([sect],2147483647)
      

  9.   

    我把问题 及 大家的解答重新整理了一下,请大家再关注一下第2个问题
    -- 我有一张表tax,数据约有2000万条,有以下字段
    -- ID int 递增,主键
    -- 纳税人内部码 varchar(50), 指的是纳税的单位对应的纳税ID 
    -- 纳税个人内部码 varchar(50),指的是纳税个人对应的纳税ID
    -- 代扣代缴单位 varchar(200), 指的是纳税的单位名称
    -- 通讯地址 varchar(200),    指的是纳税的单位的通讯地址
    -- 地市名称 varchar(20),     指纳税单位或个人所在的城市
    -- station varchar(8),        指的是通讯地址所属的站,8位数字组成,也有null值存在
    -- sect varchar(3),          指的是通讯地址所属的段,1-3位数组成,也有null值存在,不足3位前面没有补位-- countnumber int,           指的是数据中同一 纳税人内部码 且 同一通讯地址的记录条数
    -- 信息编码 varchar(50),     信息编码是按业务需求规则定制的,它由 station + '-' + 'sect + '-' + 纳税人内部码 + '-' + 流水号 构成
                    -- 即同一 station、sect、纳税人内部码, 流水号就由“纳税个人内部码排序”,
                    -- 第1条的流水号为“000001”,最后一条的流水号为“countnumber”
                    -- 即流水号为 1 至 countnumber 的最大值,流水号为固定6位,不足6位的前面补0
    -- 假设有以下数据:则它的信息编码的流水号应为最右列,举例如下:
    -- ID 纳税人内部码 代扣代缴单位  通讯地址 station sect countnumber 流水号
    -- 31   001          aaa   address1   1      1     3902      000001
    -- 32   001          aaa         address1   1      1     3902      000002
    -- 33   001          aaa         address1   1      1     3902      000003
    -- 34   001          aaa         address1   1      1     3902      000004
    -- ....一直至3902条                                                003902
    -- 3933 002         bbb          address2   2      1     255       000001
    -- 3934 002         bbb          address2   2      1     255       000002
    -- 3935 002         bbb          address2   2      1     255       000003
    -- 3936 002         bbb          address2   2      1     255       000004
    -- ...一直至3932+255条,如此类推                                   004187
    -- 注意:不能用ID作为参考来编流水号,上面的ID只是举例,实际数据中,流水号有可能是1、103、1000、40014,即1-6位。
    -- 其中,countnumber、信息编码 2个字段是手工新增的,要求先填充数据,再排序数据
    -- 要求用高效和精简的SQL语句实现:
    -- 1、按countnumber字段要求统计出数值填充到countnumber字段中(已实现);
         update tax set countnumber = (select count(1) from tax where 纳税人内部码 = t.纳税人内部码 and 通讯地址 = t.通讯地址) from tax t-- 2、按信息编码字段要求填充到信息编码字段中(未实现);
         -- 用1000000 + countnumber的值 ,然后取它右边的6位数字
         -- update tax set 信息编码 = isnull(station,'') + '-' + isnull(sect,'') + '-' + 纳税人内部码 + '-' + right('00000'+cast(countnumber as varchar),6)
         --上方法未能行得通-- 3、排序数据,按station,sect,countnumber desc,纳税人内部码,代扣代缴单位  来排序,其中,凡是字段中有null值的要排在有值的后面(已实现)
         select * from tax order by isnull([station],2147483647),isnull([sect],2147483647),countnumber desc,纳税人内部码,代扣代缴单位