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,代码是否有所不同?

解决方案 »

  1.   

    if object_id('pubs..tb') is not null
       drop table tb
    gocreate 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 行)*/
      

  2.   

    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 经营等级
      

  3.   

    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 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 tb
    group by 经营等级
      

  4.   

    上面是静态的SQL,下面是动态的SQL,结果如上.if object_id('pubs..tb') is not null
       drop table tb
    gocreate 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)
    godeclare @sql varchar(8000)
    set @sql = 'select 权属,经营等级,sum(面积) ' + ''' 总面积合计 '''
    select @sql = @sql + ' , sum(case 森林类别 when ''' + 森林类别 + ''' then 面积 else 0 end) [' + 森林类别 + ']'
    from (select distinct 森林类别 from tb) as a
    set @sql = @sql + ' from tb group by 权属,经营等级'
    exec(@sql) drop table tb
      

  5.   

    case when 似乎不被access支持,如何办?
      

  6.   

    对,以上语句在SQL中实现.在ACCESS不知道能不能用?不好意思.
      

  7.   

    select 权属,经营等级, 
      
    sum(iif(森林类别 = '用材林',shiyan1.面积,0)) as 用材林合计,
    sum(iif(森林类别 = '薪炭林',shiyan1.面积,0)) as 薪炭林合计,
    sum(iif(森林类别 = '经济林',shiyan1.面积,0)) as 经济林合计from shiyan1
    group by 权属,经营等级这样可以拉。