日期:2014-05-19  浏览次数:20404 次

请教一个稍微复杂的查询,在线等
Num 森林类别 权属 经营等级 林种 面积
1 用材林 1 2 2 221.4
2 薪炭林 1 1 3 2332
3 经济林 3 3 4 677
4 用材林 2 2 3 2332.7
5 用材林 1 2 3 544
6 薪炭林 1 1 2 6788


以上的表,想得到:

Num 权属 经营等级   总面积合计   用材林合计   薪炭林合计   经济林合计
1 1 1 。。 。。 。。 。。
1 1 2 。。      

即,按照权属和经营等级分组,统计面积合计项目

如何写代码?

如果是access,代码是否有所不同?

------解决方案--------------------
if object_id( 'pubs..tb ') is not null
drop table tb
go

create table tb(Num int,森林类别 varchar(10),权属 varchar(10),经营等级 varchar(10),林种 varchar(10),面积 decimal(18,2))
insert into tb(Num,森林类别,权属,经营等级,林种,面积) values(1, '用材林 ', '1 ', '2 ', '2 ',221.4)
insert into tb(Num,森林类别,权属,经营等级,林种,面积) values(2, '薪炭林 ', '1 ', '1 ', '3 ',2332)
insert into tb(Num,森林类别,权属,经营等级,林种,面积) values(3, '经济林 ', '3 ', '3 ', '4 ',677)
insert into tb(Num,森林类别,权属,经营等级,林种,面积) values(4, '用材林 ', '2 ', '2 ', '3 ',2332.7)
insert into tb(Num,森林类别,权属,经营等级,林种,面积) values(5, '用材林 ', '1 ', '2 ', '3 ',544)
insert into tb(Num,森林类别,权属,经营等级,林种,面积) values(6, '薪炭林 ', '1 ', '1 ', '2 ',6788)

select 权属,经营等级,
sum(面积) '总面积合计 ',
sum(case when 森林类别 = '用材林 ' then 面积 else 0 end) as '用材林合计 ',
sum(case when 森林类别 = '薪炭林 ' then 面积 else 0 end) as '薪炭林合计 ',
sum(case when 森林类别 = '经济林 ' then 面积 else 0 end) as '经济林合计 '
from tb
group by 权属,经营等级

drop table tb
/*
权属 经营等级 总面积合计 用材林合计 薪炭林合计 经济林合计
---------- ---------- ---------- ---------- ---------- ----------
1 1 9120.00 .00 9120.00 .00
1 2 765.40 765.40 .00 .00
2 2 2332.70 2332.70 .00 .00
3 3 677.00 .00 .00 677.00

(所影响的行数为 4 行)

*/
------解决方案--------------------
select Num=min(Num)权属=min(权属),,经营等级,总面积合计=sum(面积),
用材林合计=sum(case when 森林类别 = '用材林 ' then 面积 else 0 end),
薪炭林合计=sum(case when 森林类别 = '薪炭林 ' then 面积 else 0 end),
经济林合计=sum(case when 森林类别 = '经济林 ' then 面积 else 0 end)
from tablename
group by 经营等级