求助SQL语句的写法

邈淞 2004-06-25 09:25:52
数据库中有2个表
表A
序号 填报人 填报单位 类别 面积
1 张 AA 1 100
2 李 AA 2 200
3 王 BB 2 100
4 李 AA 1 200
5 刘 BB 2 100
表B
序号 填报人 填报单位 方式 面积
1 张 AA 1 400
2 李 AA 2 100
3 王 BB 1 200
4 李 AA 1 100
5 刘 BB 1 100


想得到的结果
填报单位 类别1面积 类别2面积 方式1面积 方式2面积
AA 300 200 500 100
BB 0 200 300 0
表中记录很多,上面只是简单列举了几条。
请高手赐教。
...全文
165 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
邈淞 2004-06-25
  • 打赏
  • 举报
回复
明白了,谢谢各位的解答,结贴。
zjcxc 元老 2004-06-25
  • 打赏
  • 举报
回复
有事情做,不是来去匆匆

以后这类回复有错误的,我没回的话,你可以发信息给我,如果我在线,就会再回
zjcxc 元老 2004-06-25
  • 打赏
  • 举报
回复
--测试

--测试数据
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,100

create 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
--*/
zjcxc 元老 2004-06-25
  • 打赏
  • 举报
回复
--查询
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.填报单位
')
邈淞 2004-06-25
  • 打赏
  • 举报
回复
晕,大家都是来去匆匆,邹建麻烦再进来一下,修改你的方法啊。
邈淞 2004-06-25
  • 打赏
  • 举报
回复
to victorycyz(中海)
结果的显示方式已经定了,我不能修改的
邈淞 2004-06-25
  • 打赏
  • 举报
回复
zjcxc(邹建) 的方法很好,不过求出的结果似乎不对
solidpanther(╃╄╃我爱机器猫╄╃╄) 和 victorycyz(中海) 的方法容易理解,而且结果也对,不过不够灵活,因为类别和方式不是只有这2种
solidpanther 2004-06-25
  • 打赏
  • 举报
回复
补充:select 填报单位,sum(类别1面积)......
solidpanther 2004-06-25
  • 打赏
  • 举报
回复

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 填报单位
邈淞 2004-06-25
  • 打赏
  • 举报
回复
to zjcxc(邹建)
用你的方法求出的结果如下,是真实值的2倍
填报单位 类别1面积 类别2面积 方式1面积 方式2面积
AA 600 400 1000 200
victorycyz 2004-06-25
  • 打赏
  • 举报
回复

如果类别和方式的数目不定,那要考虑你的查询结果显示到报表是不是可能太宽?

考虑竖排是不是更好? 查询语句也简单:

填报单位 类别或方式 面积
A 类别1 300
A 方式1 500
......
zjcxc 元老 2004-06-25
  • 打赏
  • 举报
回复
--测试

--测试数据
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,100

create 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
--*/
zjcxc 元老 2004-06-25
  • 打赏
  • 举报
回复
--写错一个字段

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 填报单位')
victorycyz 2004-06-25
  • 打赏
  • 举报
回复
类别和方式是不是分别只有两种?如果是:

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.填报单位


邈淞 2004-06-25
  • 打赏
  • 举报
回复
to zjcxc(邹建)
不是对应的,他们都是代码项,比如类别有4种,方式有5种。
zjcxc 元老 2004-06-25
  • 打赏
  • 举报
回复
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 填报单位')
zjcxc 元老 2004-06-25
  • 打赏
  • 举报
回复
看错了,你是分开显示的
dut 2004-06-25
  • 打赏
  • 举报
回复
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.填报单位

zjcxc 元老 2004-06-25
  • 打赏
  • 举报
回复
类别和方式是对应的吗? 如果类别,没有方式,怎么显示?

34,594

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧