name & 合计可以这样写,小计不知是什么意思。Select name,count(*) as 合计 from 
(
   Select name from 表1
   Union All
   Select name from 表2
   Union All
   Select name from 表3
)temp
group by name

解决方案 »

  1.   

    不会出现小计三小计就是合计中分出来的而且只有二个小计目的就是说:从各个表中统计NAME出现的个数,如果有一个表出现NAME,另一个表不出现,则小计二为0。
      

  2.   

    不知道有没有理解错你的意思:
    select name,合计,小计一,合计-小计一 as 小计二
    from(
    select isnull(a.name,isnull(b.name,c.name)) as name
    ,isnull(a.aa,0)+isnull(b.aa,0)+isnull(c.aa,0) as 合计
    ,isnull(a.aa,isnull(b.aa,isnull(c.aa,0))) as 小计一
    from(
    select NAME,count(*) as aa from 表1 group by NAME
    ) a full join (
    select NAME,count(*) as aa from 表2 group by NAME
    ) b on a.name=b.name full join (
    select NAME,count(*) as aa from 表3 group by NAME
    ) c on a.name=c.name) a order by 合计 desc,name
      

  3.   

    /*
    下面是数据测试
    */
    --创建数据测试环境
    declare @tb1 table(ID int,[USER] varchar(1),NAME varchar(2))
    declare @tb2 table(ID int,[USER] varchar(1),NAME varchar(2))
    declare @tb3 table(ID int,[USER] varchar(1),NAME varchar(2))insert into @tb1
    select 1,'A','中'
    union all select 2,'B','有'insert into @tb2
    select 1,'C','中'
    union all select 2,'D','的'insert into @tb3
    select 1,'F','有'
    union all select 2,'E','我'--得到结果
    select name,合计,小计一,合计-小计一 as 小计二
    from(
    select isnull(a.name,isnull(b.name,c.name)) as name
    ,isnull(a.aa,0)+isnull(b.aa,0)+isnull(c.aa,0) as 合计
    ,isnull(a.aa,isnull(b.aa,isnull(c.aa,0))) as 小计一
    from(
    select NAME,count(*) as aa from @tb1 group by NAME
    ) a full join (
    select NAME,count(*) as aa from @tb2 group by NAME
    ) b on a.name=b.name full join (
    select NAME,count(*) as aa from @tb3 group by NAME
    ) c on a.name=c.name) a order by 合计 desc,name/*-------------------------------------------------
    上面语句的执行结果:
    name 合计          小计一         小计二         
    ---- ----------- ----------- ----------- 
    有    2           1           1
    中    2           1           1
    的    1           1           0
    我    1           1           0(所影响的行数为 4 行)
    -----------------------------------------------------*/
      

  4.   

    好像是理解正确不过,你的语句不太理解这a b c 
    是什么????
      

  5.   

    zjcxc(邹建),你太牛了,我想了好久,都没有想到这里,确实可以实现!!!让我开了眼界!
      

  6.   

    a b c 是为查询定义一个别名,这样在外层的查询中就可以引用它.
      

  7.   

    to  zjcxc(邹建) 如果,我现在有5个表,又该如何???
      

  8.   

    5个表?如果也只用小计一,小计二的话,写法一样.select name,合计,小计一,合计-小计一 as 小计二
    from(
    select isnull(a.name,isnull(b.name,c.name)) as name
    ,isnull(a.aa,0)+isnull(b.aa,0)+isnull(c.aa,0)+isnull(d.aa,0)+isnull(e.aa,0) as 合计
    ,isnull(a.aa,isnull(b.aa,isnull(c.aa,isnull(d.aa,isnull(e.aa,0))))) as 小计一
    from(
    select NAME,count(*) as aa from 表1 group by NAME
    ) a full join (
    select NAME,count(*) as aa from 表2 group by NAME
    ) b on a.name=b.name full join (
    select NAME,count(*) as aa from 表3 group by NAME
    ) c on a.name=c.name full join (
    select NAME,count(*) as aa from 表4 group by NAME
    ) d on a.name=d.name full join (
    select NAME,count(*) as aa from 表5 group by NAME
    ) e on a.name=c.name) a order by 合计 desc,name
      

  9.   

    declare @1 int,@2 varchar(10),@sql varchar(8000)select *,0 flag2 into # from (select *,0 flag from 你的表1 union all select *,1 from 你的表2 union all select *,3 from 你的表3) tem order by name
    update # set @1=case when @2=name then @1+1 else 1 end,@2=name,flag2=@1set @sql = 'select name,count(*) 合计'
    select @sql = @sql + ',max(case flag2 when '''+cast(flag2 as varchar(10))+''' then ''1(在第''+cast(flag as varchar(10))+''张表)'' else ''0(不在任何表)'' end) [小计'+cast(flag2 as varchar(10))+']'
      from (select distinct flag2 from #) as a
    select @sql = @sql+' from # group by name order by count(*) desc'exec(@sql)
      

  10.   

    测试:create table #1 (ID int,[USER] varchar(1),NAME varchar(2))
    create table #2 (ID int,[USER] varchar(1),NAME varchar(2))
    create table #3 (ID int,[USER] varchar(1),NAME varchar(2))insert into #1 select 1,'A','中'  union all select 2,'B','有' insert into #2 select 1,'C','中' union all select 2,'D','的' insert into #3 select 1,'F','有' union all select 2,'E','我'
    ------------------
    declare @1 int,@2 varchar(10),@sql varchar(8000)select *,0 flag2 into # from (select *,0 flag from #1 union all select *,1 from #2 union all select *,3 from #3) tem order by name
    update # set @1=case when @2=name then @1+1 else 1 end,@2=name,flag2=@1set @sql = 'select name,count(*) 合计'
    select @sql = @sql + ',max(case flag2 when '''+cast(flag2 as varchar(10))+''' then ''1(在第''+cast(flag as varchar(10))+''张表)'' else ''0(不在任何表)'' end) [小计'+cast(flag2 as varchar(10))+']'
      from (select distinct flag2 from #) as a
    select @sql = @sql+' from # group by name order by count(*) desc'exec(@sql)go
    drop table #1,#2,#3,#
      

  11.   

    declare @1 int,@2 varchar(10),@sql varchar(8000),@sql2 varchar(8000)select @sql2='',@1=0select @sql2=@sql2+' union all select *,'+cast(@1 as varchar(10))+' flag from '+name,@1=@1+1 from sysobjects where xtype='u' and name like '你的表名条件%'set @sql2=right(@sql2,len(@sql2)-10)--select *,0 flag2 into # from (select *,0 flag from #1 union all select *,1 from #2 union all select *,3 from #3) tem order by nameset @sql = 'select name,count(*) 合计'
    select @sql = @sql + ',max(case flag2 when '''+cast(flag2 as varchar(10))+''' then ''1(在第''+cast(flag as varchar(10))+''张表)'' else ''0(不在任何表)'' end) [小计'+cast(flag2 as varchar(10))+']' from (select distinct flag2 from #) aexec('select *,0 flag2 into # from ('+@sql2+' ) tem order by name declare @1 int,@2 varchar(10) update # set @1=case when @2=name then @1+1 else 1 end,@2=name,flag2=@1 '+@sql+' from # group by name order by count(*) desc')