日期:2014-05-18 浏览次数:20502 次
-- 我有一张表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,纳税人内部码,代扣代缴单位