SQL> select count(1) from aa;  COUNT(1)
----------
         7SQL> select 100+(select count(1) from aa) from dual;100+(SELECTCOUNT(1)FROMAA)
--------------------------
                       107

解决方案 »

  1.   

    SQL> select count(1) from aa;  COUNT(1)
    ----------
             7SQL> select 100+(select count(1) from aa) from dual;100+(SELECTCOUNT(1)FROMAA)
    --------------------------
                           107
      

  2.   

    11:11:07 SQL> select 100+count(*) from tab;
             101Elapsed: 00:00:00.15
    11:40:09 SQL> select count(*) from tab;
             1Elapsed: 00:00:00.01
    11:40:27 SQL>
      

  3.   

    直接写成select 100+count(*) from zltxsh001不就可以了。
      

  4.   

    select 100+count(*) from zltxsh001这种写法当然没有问题,但是似乎不太合乎我的需求了,请看我下面的SQL语句:
    select (select count(data) from zltxsh001 where data>10)/(select count(data) from zltxsh001) from dual;
    --类似于计算合格率beckhambobo(beckham) 的做法,似乎仅仅是把Count(*)换成了count(具体字段名),我这儿改成了字段data,但是依然提示表达式错误,会不会因为我的Oracle版本是8.05?
      

  5.   

    SQL> select count(data) from zltxsh001 where data>10; COUNT(DATA) 
    ----------- 
    48 SQL> select count(data) from zltxsh001; COUNT(DATA) 
    ----------- 
    85 SQL> select (select count(data) from zltxsh001 where data>10)/(select count(data) from zltxsh001) from dual; 
    select (select count(data) from zltxsh001 where data>10)/(select count(data) from zltxsh001) from du 

    错误位于第1行: 
    ORA-00936: 缺少表达式
      

  6.   

    如果我想用到两个、三个表中得来的数据,应该怎么办呢?比如下面的语句: 
    select (select count(data) from zltxsh001 where data>10)/((select count(data) from zltxsh002)+(select count(data) from zltxsh003)) from dual;
      

  7.   

    select count(a.data)/count(b.data) from zltxsh001 a,zltxsh001 b where a.data>10试试看!如果可以的话你就有福了,因为多个表相加的情况也可以这样处理,根本不需要从DUAL中取。
      

  8.   

    如果可以的话,不过很奇怪的是可以执行,但结果不正确;如下:SQL> select count(zltxsh001.lrsj) from zltxsh001;COUNT(ZLTXSH001.LRSJ)
    ---------------------
                       85SQL> select count(zltxlg0002.lrsj) from zltxlg0002;COUNT(ZLTXLG0002.LRSJ)
    ----------------------
                       624SQL> select count(zltxsh001.data)/count(zltxlg0002.data) from zltxsh001,zltxlg0002;COUNT(ZLTXSH001.DATA)/COUNT(ZLTXLG0002.DATA)
    --------------------------------------------
                                               1SQL> select count(a.data)/count(b.data) from zltxsh001 a,zltxsh001 b where a.data>10;COUNT(A.DATA)/COUNT(B.DATA)
    ---------------------------
                              1
      

  9.   

    哦,不好意思,这样不行!像上面这样写会产生笛卡尔积,两者数目是一样的,所以会是1。这样试试:
    select temp,count(b.data),temp/count(b.data) from zltxsh001 b,
    (select count(a.data) temp from zltxsh001 a where a.data>10) tmpTable
    group by temp
    这样temp/count(b.data)就是合格率了。如果再不行俺就帮不了你了,^-^
      

  10.   

    To pegtop(开始做硬件了):非常感谢!同时在您的启发下,采用下面的方式会更直观,效率更高些,不需要那么多笛卡儿积了。而且可以处理任意多个数据 。不过还是不如SQLServer里爽,直接就可以用select count()的结果SQL> select temp1,temp2,temp3 from
      2  (select count(a.data) temp1 from zltxsh001 a where a.data>10) tmpTable1,
      3  (select count(a.data) temp2 from zltxsh001 a where a.data>20) tmpTable2,
      4  (select count(a.data) temp3 from zltxsh001 a ) tmpTable3;    TEMP1     TEMP2     TEMP3
    --------- --------- ---------
           48         7        85SQL> select temp1/temp2,temp2/temp3 from 
      2  (select count(a.data) temp1 from zltxsh001 a where a.data>10) tmpTable1,
      3  (select count(a.data) temp2 from zltxsh001 a where a.data>20) tmpTable2,
      4  (select count(a.data) temp3 from zltxsh001 a ) tmpTable3;TEMP1/TEMP2 TEMP2/TEMP3
    ----------- -----------
      6.8571429   .08235294
      

  11.   

    最佳的方式看来应该是这样,把统计过程放在一个函数里,通过提供表名等参数返回函数结果,这样无论在什么地方都可以用了,嘿嘿不过我试着写了一个函数,结果:
    SQL> create or replace function getCount(tablename in varchar2,n in varchar2)
      2  return number
      3  is
      4  resultvalue NUMBER(8,2);
      5  l_str varchar2(1000);
      6  cursor_i INTEGER;
      7  cursor_ret INTEGER;
      8  begin
      9    l_str:='select count(*) into resultvalue from '||tablename||' where data>='||n;
     10      cursor_i:=dbms_sql.open_cursor;
     11   DBMS_SQL.PARSE(cursor_i,l_str,DBMS_SQL.NATIVE);
     12   cursor_ret:=dbms_sql.execute(cursor_i);
     13   dbms_sql.close_cursor(cursor_i);
     14  return resultvalue;
     15  end;
     16  /函数已创建。SQL> select getCount('zltxsh001','10') from dual;
    select getCount('zltxsh001','10') from dual
           *
    错误位于第1行:
    ORA-06571: 函数GETCOUNT不能保证不更新数据库
      

  12.   

    这个问题偶遇到过!最后是空杯帮助解决的。跟楼上的一样总结的是:把select中的子查询放到from子句中。请参见:http://expert.csdn.net/Expert/topic/1664/1664516.xml?temp=.4725153
      

  13.   

    由于我用的Oracle版本是8.0.5,所以只能使用DBMS_SQL包来执行动态语句
    不知道怎样修改一下才能搞定
      

  14.   

    shahand(死磕),多谢
      
    以前写了些SQL语句,也没怎么想到底怎么实现的;参考了pegtop和你给出的那个例子,想一下 SQL执行的机理,也颇为有趣呀。
      

  15.   

    select sum(decode(sign(data-10),1,1))/sum(decode(sign(data-20),1,1)),sum(decode(sign(data-20),1,1))/count(1) from zltxsh001
      

  16.   

    我没用过这种用法,你可能写的有误吧如何利用DBMS_SQL包和游标计算当前用户下所有表的行数?http://www.oradb.net/dba/dba_032.htm
      

  17.   

    create or replace function getCount(tablename in varchar2)
    return number
    is
    resultvalue NUMBER(8,2);
    l_str varchar2(1000);
    cursor_i INTEGER;
    cursor_ret INTEGER;
    begin
     l_str:='select count(1) from '||tablename ;
     cursor_i:=dbms_sql.open_cursor;
     DBMS_SQL.PARSE(cursor_i,l_str,DBMS_SQL.NATIVE);
     DBMS_SQL.DEFINE_COLUMN(cursor_i,1,resultvalue);
     cursor_ret:=dbms_sql.execute(cursor_i);
     
      If dbms_sql.fetch_rows(cursor_i) > 0 then 
         Dbms_sql.column_value(cursor_i,1,resultvalue); 
      End if;  
      
     dbms_sql.close_cursor(cursor_i);
    return resultvalue;
    exception when others then
      dbms_output.put_line('@@'||sqlerrm);
    end;----------------------------------------------------------
    SQL> select getcount('an_bureau') from dual
      2  /GETCOUNT('AN_BUREAU')
    ---------------------
                       13
      

  18.   

    create or replace function getCount(tablename in varchar2)
    return number
    is
    resultvalue NUMBER(8,2);
    l_str varchar2(1000);
    cursor_i INTEGER;
    cursor_ret INTEGER;
    begin
     l_str:='select count(1) from '||tablename ;
     cursor_i:=dbms_sql.open_cursor;
     DBMS_SQL.PARSE(cursor_i,l_str,DBMS_SQL.NATIVE);
     DBMS_SQL.DEFINE_COLUMN(cursor_i,1,resultvalue);
     cursor_ret:=dbms_sql.execute(cursor_i);
     
      If dbms_sql.fetch_rows(cursor_i) > 0 then 
         Dbms_sql.column_value(cursor_i,1,resultvalue); 
      End if;  
      
     dbms_sql.close_cursor(cursor_i);
    return resultvalue;
    exception when others then
      dbms_output.put_line('@@'||sqlerrm);
    end;----------------------------------------------------------
    SQL> select getcount('an_bureau') from dual
      2  /GETCOUNT('AN_BUREAU')
    ---------------------
                       13
      

  19.   

    To: shahand(死磕) 
        你用的Oracle哪个版本?我用的8.0.5,建立函数成功,执行时依然提示:
        SQL> select getCount('zltxsh001') from dual;
    select getCount('zltxsh001') from dual
           *
    错误位于第1行:
    ORA-06571: 函数GETCOUNT不能保证不更新数据库到底怎样才能保证函数不更新数据库啊?
      

  20.   

    呵呵,楼主,终于解决了!其实我个人感觉Sql Server也还是有一些方面比oracle强的,T-Sql和PL/SQL不能简单地用强弱来衡量,MS也不像部分人说的那样一无是处。就像楼主这个问题,我以前在SQL SERVER下做过,很容易解决,也不会有什么性能问题。ORACLE肯定也能解决,但像这样太麻烦了,就如同写Basic和C程序一样,一个写成a=a+1,另一个则a++就可以了!
      

  21.   

    pegtop(开始做硬件了): 感谢无私帮助,呵呵。
      不过,刚刚用Oralce对这些东西还是不很熟;尤其找不到比较合适的参考资料;或者都太厚吧,准备另开一帖学习一下关于动态SqL语句,以及函数的问题