建立一个表(投资项目明细表),字段如下:
id(自动编号),乡镇名称,企业名称,项目名称,计划投资,实际投资,日期;
现在要求按各乡镇来统计今年的实际投资总额与去年的比率。我想应该是个子查询,但我不知怎么写,请赐教。

解决方案 »

  1.   

    什么数据库?oracle还是sqlserver?
      

  2.   

    select 乡镇名称,
        sum(case when year(日期)=2002 then 实际投资 else 0 end) as 去年实际总额,
        sum(case when year(日期)=2003 then 实际投资 else 0 end) as 今年实际总额,
        sum(case when year(日期)=2002 then 实际投资 else 0 end)/
        sum(case when year(日期)=2003 then 实际投资 else 0 end)*100 as 比率
      from 你的表 group by 乡镇名称
      

  3.   

    不用子查询用case就可以了不知道你的数据库,写下思路把select 乡镇名称,sum(case 日期.年=2003 then 实际投资 else 0)/sum(case 日期.年=2002 then 实际投资 else 0) as 投资同比 from 表名 order by 乡镇名称
      

  4.   

    我用的是access数据库,还可以用case语句吗?
      

  5.   

    试一下吧,不行的话多写一点代码
    select 
     A.乡镇名称,A.去年实际总额,B.今年实际总额,A.去年实际总额/B.今年实际总额*100 as 比率
    from 
     (select 乡镇名称,sum(实际总额) from 表 where year(日期)=2002 group by 乡镇名称) A
    left join
     (select 乡镇名称,sum(实际总额) from 表 where year(日期)=2003 group by 乡镇名称) B
    on A.乡镇名称=B.乡镇名称要确保今年乡镇与去年乡镇一样,如果不一样再加一个表,把乡镇名称全抓出来
      

  6.   

    我是说怎么用在SQL语句中,使得比率的小数点只保留两位。
      

  7.   

    cast(A.去年实际总额/B.今年实际总额*100,numeric(4,2)) as 比率
      

  8.   

    修正:
    cast(A.去年实际总额/B.今年实际总额*100 as numeric(4,2)) as 比率
      

  9.   

    哦,你的数据库是access的,可能不支持cast,
    你可用取整函数
    ROUNDDOWN
    向下(朝零的方向)对数字取整。若该函数返回错误值 #NAME?,则说明可能需要安装 msowcf.dll。语法ROUNDDOWN(number,num_digits)Number   是需要向下取整的任意实数。Num_digits   是取整后要保留的位数。此参数为负数表示要保留小数点左边的整数部分,为 0 或忽略时表示取整为最接近的整数。将要取整的数乘以100,然后取整,然后再除100
      

  10.   

    wdsimon(老王) :我是把这条查询语句用在了ADOQUERY.SQL属性里了,你的
    select 
     A.乡镇名称,A.去年实际总额,B.今年实际总额,A.去年实际总额/B.今年实际总额*100 as 比率
    from 
     (select 乡镇名称,sum(实际总额) from 表 where year(日期)=2002 group by 乡镇名称) A
    left join
     (select 乡镇名称,sum(实际总额) from 表 where year(日期)=2003 group by 乡镇名称) B
    on A.乡镇名称=B.乡镇名称
    这些语句编译通过了,但此后加了函数ROUNDDOWN(number,num_digits)或formatfloat('#.00',3.1)等,都提示函数为定义,我真的到是哪儿出毛病,我还急着把‘比率'的小数部分固定为两位.请各位大侠再帮帮忙.
      

  11.   

    wdsimon(老王) :我是把这条查询语句用在了ADOQUERY.SQL属性里了,你的
    select 
     A.乡镇名称,A.去年实际总额,B.今年实际总额,A.去年实际总额/B.今年实际总额*100 as 比率
    from 
     (select 乡镇名称,sum(实际总额) from 表 where year(日期)=2002 group by 乡镇名称) A
    left join
     (select 乡镇名称,sum(实际总额) from 表 where year(日期)=2003 group by 乡镇名称) B
    on A.乡镇名称=B.乡镇名称
    这些语句编译通过了,但此后加了函数ROUNDDOWN(number,num_digits)或formatfloat('#.00',3.1)等,都提示“函数未定义”,我真的不知道是哪儿出了毛病,我还急着把‘比率'的小数部分固定为两位.请各位大侠再帮帮忙.
      

  12.   

    format函数Access绝对支持
    一般情况下,vb支持的函数,access都支持
    例如:
    ' 用户自定义的格式。
    MyStr = Format(5459.4, "##,##0。00")    ' 返回 "5,459.40"。
    MyStr = Format(334。9, "###0。00")    ' 返回 "334.90"。
    MyStr = Format(5, "0。00%")    ' 返回 "500.00%"。
    更改:
    select 
     A.乡镇名称,A.去年实际总额,B.今年实际总额,Format( A.去年实际总额/B.今年实际总额,"###0.00") as 比率
    from 
     (select 乡镇名称,sum(实际总额) from 表 where year(日期)=2002 group by 乡镇名称) A
    left join
     (select 乡镇名称,sum(实际总额) from 表 where year(日期)=2003 group by 乡镇名称) B
    on A.乡镇名称=B.乡镇名称access 2000通过
      

  13.   

    试一下SmallHand(火龍)的吧,我没用过ACCESS,刚刚又查了一下ACCESS帮助,
    ROUNDDOWN函数需要安装msowcf.dll。
      

  14.   

    谢谢各位的支持,不过
    select 
     A.乡镇名称,A.去年实际总额,B.今年实际总额,Format( A.去年实际总额/B.今年实际总额,"###0.00") as 比率
    编译时,出现了类型不匹配,可能:
    A.去年实际总额/B.今年实际总额
    是string类型,而format()需的是float类型。
    有没有类型转换函数,将sting转换为float的函数,不过要适用于access数据库的。
      

  15.   


     select a = (select b from f where f.code = d.code) from d