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.填报单位
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.填报单位
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 填报单位')
不是对应的,他们都是代码项,比如类别有4种,方式有5种。
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.填报单位
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 填报单位')
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
--*/
用你的方法求出的结果如下,是真实值的2倍
填报单位 类别1面积 类别2面积 方式1面积 方式2面积
AA 600 400 1000 200
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 填报单位
solidpanther(╃╄╃我爱机器猫╄╃╄) 和 victorycyz(中海) 的方法容易理解,而且结果也对,不过不够灵活,因为类别和方式不是只有这2种
结果的显示方式已经定了,我不能修改的
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.填报单位
')
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
--*/