select isnull(a.填报单位,b.填报单位) as 填报单位
isnull(类别1面积,0) as 类别1面积,
isnull(类别2面积,0) as 类别2面积,
isnull(方式1面积,0) as 方式1面积,
isnull(方式2面积,0) as 方式2面积
from (
select 填报单位,
sum(case 类别 when 1 then 面积 else 0 end) as 类别1面积,
sum(case 类别 when 2 then 面积 else 0 end) as 类别2面积
from 表A
group by 填报单位
) as a full join (
select 填报单位,
sum(case 方式 when 1 then 面积 else 0 end) as 方式1面积,
sum(case 方式 when 2 then 面积 else 0 end) as 方式2面积
from 表B
group by 填报单位
) as b
on a.填报单位=b.填报单位

解决方案 »

  1.   

    declare @s1 varchar(8000),@s2 varchar(8000)
    select @s1='',@s2=''
    select @s1=@s1+',[类别'+cast(类别 as varchar)+'面积]=sum(case 类别 when '
    +cast(类别 as varchar)+' then 面积1 else 0 end)'
    from 表A group by 类别
    select @s2=@s2+',[方式'+cast(方式 as varchar)+'面积]=sum(case 类别 when '
    +cast(类别 as varchar)+' then 面积2 else 0 end)'
    from 表b group by 方式
    exec('select 填报单位'+@s1+@s2+'
    from(
    select 填报单位=isnull(a.填报单位,b.填报单位),类别,方式,面积1,面积2
    from(
    select 填报单位,类别,面积1=sum(面积)
    from 表A group by 填报单位,类别
    )a full join(
    select 填报单位,方式,面积2=sum(面积)
    from 表B group by 填报单位,方式
    )b on a.填报单位=b.填报单位
    )a group by 填报单位')
      

  2.   

    to zjcxc(邹建)
    不是对应的,他们都是代码项,比如类别有4种,方式有5种。
      

  3.   

    类别和方式是不是分别只有两种?如果是:select isnull(a.填报单位,b.填报单位),
    a.s1 as 类别1面积,
    a.s2 as 类别2面积,
    b.m1 as 方式1面积,
    b.m2 as 方式2面积
    from
        ( select 填报单位,
                 sum(case when 类别='1' then 面积 else 0 end) as s1,
                 sum(case when 类别='2' then 面积 else 0 end) as s2,
          from tableA
          group by 填报单位
        ) a full join
        ( select 填报单位,
                 sum(case when 方式='1' then 面积 else 0 end) as m1,
                 sum(case when 方式='2' then 面积 else 0 end) as m2,
          from tableB
          group by 填报单位
        ) b
        on a.填报单位=b.填报单位
      

  4.   

    --写错一个字段declare @s1 varchar(8000),@s2 varchar(8000)
    select @s1='',@s2=''
    select @s1=@s1+',[类别'+cast(类别 as varchar)+'面积]=sum(case 类别 when '
    +cast(类别 as varchar)+' then 面积1 else 0 end)'
    from 表A group by 类别
    select @s2=@s2+',[方式'+cast(方式 as varchar)+'面积]=sum(case 类别 when '
    +cast(方式 as varchar)+' then 面积2 else 0 end)'
    from 表b group by 方式
    exec('select 填报单位'+@s1+@s2+'
    from(
    select 填报单位=isnull(a.填报单位,b.填报单位),类别,方式,面积1,面积2
    from(
    select 填报单位,类别,面积1=sum(面积)
    from 表A group by 填报单位,类别
    )a full join(
    select 填报单位,方式,面积2=sum(面积)
    from 表B group by 填报单位,方式
    )b on a.填报单位=b.填报单位
    )a group by 填报单位')
      

  5.   

    --测试--测试数据
    create table 表A(序号 int,填报人 varchar(10),填报单位 varchar(10),类别 int,面积 int)
    insert 表A select 1,'张','AA',1,100
    union  all select 2,'李','AA',2,200
    union  all select 3,'王','BB',2,100
    union  all select 4,'李','AA',1,200
    union  all select 5,'刘','BB',2,100create table 表B(序号 int,填报人 varchar(10),填报单位 varchar(10),方式 int,面积 int)
    insert 表B select 1,'张','AA',1,400
    union  all select 2,'李','AA',2,100
    union  all select 3,'王','BB',1,200
    union  all select 4,'李','AA',1,100
    union  all select 5,'刘','BB',1,100
    go--查询
    declare @s1 varchar(8000),@s2 varchar(8000)
    select @s1='',@s2=''
    select @s1=@s1+',[类别'+cast(类别 as varchar)+'面积]=sum(case 类别 when '
    +cast(类别 as varchar)+' then 面积1 else 0 end)'
    from 表A group by 类别
    select @s2=@s2+',[方式'+cast(方式 as varchar)+'面积]=sum(case 类别 when '
    +cast(方式 as varchar)+' then 面积2 else 0 end)'
    from 表b group by 方式
    exec('select 填报单位'+@s1+@s2+'
    from(
    select 填报单位=isnull(a.填报单位,b.填报单位),类别,方式,面积1,面积2
    from(
    select 填报单位,类别,面积1=sum(面积)
    from 表A group by 填报单位,类别
    )a full join(
    select 填报单位,方式,面积2=sum(面积)
    from 表B group by 填报单位,方式
    )b on a.填报单位=b.填报单位
    )a group by 填报单位')
    go--删除测试
    drop table 表A,表B/*--测试结果填报单位     类别1面积     类别2面积   方式1面积   方式2面积       
    ---------- ----------- ----------- ----------- ----------- 
    AA         600         400         600         600
    BB         0           200         0           300
    --*/
      

  6.   

    to zjcxc(邹建)
    用你的方法求出的结果如下,是真实值的2倍
    填报单位  类别1面积 类别2面积  方式1面积 方式2面积
     AA   600    400     1000         200
      

  7.   


    declare @表A table (序号 varchar(1), 填报人  varchar(100),  填报单位 varchar(100),  类别 varchar(100),   面积 int)
    declare @表B table (序号 varchar(1), 填报人  varchar(100),  填报单位 varchar(100),  方式 varchar(100),   面积 int) INSERT into @表A values ('1','张','AA','1',100)
     INSERT into @表A values ('2','张','AA','2',100)
     INSERT into @表A values ('3','张','BB','2',100)
     INSERT into @表A values ('4','张','AA','1',100)
     INSERT into @表A values ('5','张','BB','2',100)INSERT into @表b values ('1','张','AA','1',100)
     INSERT into @表b values ('2','张','AA','2',100)
     INSERT into @表b values ('3','张','BB','1',100)
     INSERT into @表b values ('4','张','AA','1',100)
     INSERT into @表b values ('5','张','BB','1',100)select sum(类别1面积) as 类别1面积, sum(类别2面积) as 类别2面积, sum(方式1面积) as 方式1面积, sum(方式2面积) as 方式2面积
    from (
    select 填报单位,sum(面积) as 类别1面积,0 AS 类别2面积,0 AS 方式1面积,0 AS 方式2面积 from @表A where 类别=1 group by 填报单位 
    union
    select 填报单位,0,sum(面积) as 类别2面积,0,0 from @表A where 类别=2 group by 填报单位 
    union
    select 填报单位,0,0 ,sum(面积),0  as 方式1面积 from @表B where 方式=1 group by 填报单位 
    union
    select 填报单位,0,0,0,sum(面积) as 方式2面积 from @表B where 方式=2 group by 填报单位 
    ) t group by 填报单位
      

  8.   

    补充:select 填报单位,sum(类别1面积)......
      

  9.   

    zjcxc(邹建)  的方法很好,不过求出的结果似乎不对
    solidpanther(╃╄╃我爱机器猫╄╃╄) 和 victorycyz(中海)  的方法容易理解,而且结果也对,不过不够灵活,因为类别和方式不是只有这2种
      

  10.   

    to  victorycyz(中海) 
    结果的显示方式已经定了,我不能修改的
      

  11.   

    --查询
    declare @s1 varchar(8000),@s2 varchar(8000),@s3 varchar(8000)
    select @s1='',@s2='',@s3=''
    select @s1=@s1+',[类别'+cast(类别 as varchar)+'面积]=sum(case 类别 when '
    +cast(类别 as varchar)+' then 面积 else 0 end)'
    ,@s3=@s3+',a.[类别'+cast(类别 as varchar)+'面积]'
    from 表A group by 类别
    select @s2=@s2+',[方式'+cast(方式 as varchar)+'面积]=sum(case 方式 when '
    +cast(方式 as varchar)+' then 面积 else 0 end)'
    ,@s3=@s3+',b.[方式'+cast(方式 as varchar)+'面积]'
    from 表b group by 方式
    exec('
    select 填报单位=isnull(a.填报单位,b.填报单位)'+@s3+'
    from(
    select 填报单位'+@s1+'
    from 表A group by 填报单位
    )a full join(
    select 填报单位'+@s2+'
    from 表B group by 填报单位
    )b on a.填报单位=b.填报单位
    ')
      

  12.   

    --测试--测试数据
    create table 表A(序号 int,填报人 varchar(10),填报单位 varchar(10),类别 int,面积 int)
    insert 表A select 1,'张','AA',1,100
    union  all select 2,'李','AA',2,200
    union  all select 3,'王','BB',2,100
    union  all select 4,'李','AA',1,200
    union  all select 5,'刘','BB',2,100create table 表B(序号 int,填报人 varchar(10),填报单位 varchar(10),方式 int,面积 int)
    insert 表B select 1,'张','AA',1,400
    union  all select 2,'李','AA',2,100
    union  all select 3,'王','BB',1,200
    union  all select 4,'李','AA',1,100
    union  all select 5,'刘','BB',1,100
    go--查询
    declare @s1 varchar(8000),@s2 varchar(8000),@s3 varchar(8000)
    select @s1='',@s2='',@s3=''
    select @s1=@s1+',[类别'+cast(类别 as varchar)+'面积]=sum(case 类别 when '
    +cast(类别 as varchar)+' then 面积 else 0 end)'
    ,@s3=@s3+',a.[类别'+cast(类别 as varchar)+'面积]'
    from 表A group by 类别
    select @s2=@s2+',[方式'+cast(方式 as varchar)+'面积]=sum(case 方式 when '
    +cast(方式 as varchar)+' then 面积 else 0 end)'
    ,@s3=@s3+',b.[方式'+cast(方式 as varchar)+'面积]'
    from 表b group by 方式
    exec('
    select 填报单位=isnull(a.填报单位,b.填报单位)'+@s3+'
    from(
    select 填报单位'+@s1+'
    from 表A group by 填报单位
    )a full join(
    select 填报单位'+@s2+'
    from 表B group by 填报单位
    )b on a.填报单位=b.填报单位
    ')go--删除测试
    drop table 表A,表B/*--测试结果填报单位       类别1面积       类别2面积       方式1面积       方式2面积       
    ---------- ----------- ----------- ----------- ----------- 
    AA         300         200         500         100
    BB         0           200         300         0
    --*/