该题是计算题!计算明细表的数据和主表的操作员!
如果主表的编号是重复的,那么我的算法汇总就会有误差!
select sum(a.amount) sl,c.name mz 
From  mx a,zb b,czy c 
where  a.bm='14905' 
and a.h=b.h and b.date>'2008-12-1' and date <'2009-1-1' 
and b.id=c.id  
group by c.name 那么我就想只累加主表没有重复的表。
再单独加重复的表!
或者请高人指点!一次性的加总数据!表结构如下!
a表
bh(编号)  dm(代码)b表bh(编号)  id(操作员) date(时间) c表id(操作员)  name(姓名)
其中bh 没有进行限制,允许重复!望高手解答!

解决方案 »

  1.   

    可以试一下!
    四种方法用SQL语句删除重复记录。 
    问题:怎样把具有相同字段的纪录删除,只留下一条。 
    例如:表test里有id,name字段,如果有name相同的记录只留下一条,其余的删除。name的内容不定,相同的记录数不定。 
    方案1: 
    1、将重复的记录记入temp1表: 
    select [标志字段id],count(*) into temp1 from [表名]
    group by [标志字段id]
    having count(*)>1
    2、将不重复的记录记入temp1表: 
    insert temp1
    select [标志字段id],count(*) from [表名]
    group by [标志字段id]
    having count(*)=1
    3、作一个包含所有不重复记录的表: 
    select * into temp2 from [表名]
    where 标志字段id in(select 标志字段id from temp1)
    4、删除重复表:delete [表名] 
    5、恢复表: 
    insert [表名]
    select * from temp2
    6、删除临时表: 
    drop table temp1
    drop table temp2
    方案2: 
    declare @max integer,@id integer
    declare cur_rows cursor local for 
    select id,count(*) from 表名 group by id having count(*) > 1
    open cur_rows
    fetch cur_rows into @id,@max
    while @@fetch_status=0
    begin
    select @max = @max -1
    set rowcount @max
    delete from 表名 where id = @id
    fetch cur_rows into @id,@max
    end
    close cur_rows
    set rowcount 0
    注:set rowcount @max - 1 表示当前缓冲区只容纳@max-1条记录﹐如果有十条重复的﹐就刪除 
    10条,一定会留一条的。也可以写成delete from 表名。
    方案3: 
    create table a_dist(id int,name varchar(20))
    insert into a_dist values(1,'abc')
    insert into a_dist values(1,'abc')
    insert into a_dist values(1,'abc')
    insert into a_dist values(1,'abc')
    exec up_distinct 'a_dist','id'
    select * from a_dist
    create procedure up_distinct(@t_name varchar(30)
    ,@f_key varchar(30))
    --f_key表示是分组字段﹐即主键字段
    as
    begin
    declare @max integer,@id varchar(30) ,
    @sql varchar(7999) ,@type integer
    select @sql = 'declare cur_rows cursor 
    for select '+@f_key+' ,count(*) from ' 
    +@t_name +' group by ' +@f_key +' having count(*) > 1'
    exec(@sql)
    open cur_rows 
    fetch cur_rows into @id,@max 
    while @@fetch_status=0 
    begin 
    select @max = @max -1 
    set rowcount @max 
    select @type = xtype from syscolumns 
    where id=object_id(@t_name) and name=@f_key
    if @type=56
    select @sql = 'delete from '+@t_name+' 
    where ' + @f_key+' = '+ @id 
    if @type=167
    select @sql = 'delete from '+@t_name+' 
    where ' + @f_key+' = '+''''+ @id +'''' 
    exec(@sql)
    fetch cur_rows into @id,@max 
    end 
    close cur_rows 
    deallocate cur_rows
    set rowcount 0
    end
    select * from systypes
    select * from syscolumns where 
    id = object_id('a_dist')
    方案4: 
    可以用IGNORE_DUP_KEY: 
    create table dup (id int identity not null,
    name varchar(50)not null)
    go
    insert into dup(name) values ('abc')
    insert into dup(name) values ('abc')
    insert into dup(name) values ('abc')
    insert into dup(name) values ('abc')
    insert into dup(name) values ('abc')
    insert into dup(name) values ('abc')
    insert into dup(name) values ('abc')
    insert into dup(name) values ('cdefg')
    insert into dup(name) values ('xyz')
    insert into dup(name) values ('xyz')
    go
    select *
    from dup
    go
    create table tempdb..wk(id int not null, 
    name varchar(50)not null)
    go
    create unique index idx_remove_dup 
    on tempdb..wk(name)
    with IGNORE_DUP_KEY 
    go
    INSERT INTO tempdb..wk (id, name)
    select id, name
    from dup
    go
    select *
    from tempdb..wk
    go
    delete from dup
    go
    set identity_insert dup on
    INSERT INTO dup (id, name)
    select id, name
    from tempdb..wk
    go
    set identity_insert dup off
    go
    select *
    from dup
    go
    注:这里delete原表,再加入不重复的值。也可以通过join只delete原表中重复的值。