在Query中添加了一个计算字段,该字段的值由其他字段经过比较复杂的函数处理后得出,计算字段的代码写在了Query的OnCalcFields事件中,请问如何能对最后的查询结果以该计算字段排序?盼望高手的出现!!(我用的是Oracle数据库,数据库连接为ODAC,查询组件用的是OraQuery)

解决方案 »

  1.   

    select .... as ss ,.... order by ss
      

  2.   

    若是手工在query里添加的计算字段,好像是不能排序的
    单你可以用sql语句生产查询结果集,这样计算字段也就作为真正的字段了
    你试试,帮你顶一下!
      

  3.   

    select code,count(*)
    from yourTable
    group by code
    order by count(*) desc
      

  4.   

    或:
    select code,count(*) as con
    from yourTable
    group by code
    order by con
      

  5.   

    像 jinjazz(我是jin) ( )说的取个别名不是很好吗?
      

  6.   

    以上各位,我说的是在Query中手动添加的计算字段,它的计算过程是在Query的OnCalcFields事件完成的,不是像在Select语句中完成的(select a+b as c)这样的计算字段!我之所以把计算字段手动添加并在OnCalcFields事件中计算,是因为这个计算字段的计算方法不是简单的(+,-,*,/),而是还要经过许多自己编写的函数处理。这些自己编写的函数写在select语句中是无法运行的。
        不知道能不能按我说的这种计算字段排序啊?    
        请求各位朋友一定帮我这个忙,想想有什么办法没有?不胜感激!
        我的E_Mail: [email protected]
        qq:21954421
        有好办法的朋友可以和我联系或回帖!
      

  7.   

    "自己编写的函数处理"若用PL/SQL在Oracle Server中計算、
    不用把数据下載後計算、会提高効率...
      

  8.   

    如果用delphi取出字段后再对计算字段作排序效率不会高的,计算字段的名字是在delphi中定义的,所以不可能用sql去识别,矛盾了
      

  9.   

    难道真的没有办法么?用DXGrid只是能显示排序效果吧,它并不能实际改变数据集的真正顺序
      

  10.   

    我的愚见:先把计算字段输出到新表中,再进行排序。
    query1里有lookup和计算字段. 
    另起一个query2.query2的sql为: insert into table values(:a1, :a2, ...:aN)程序中: Query2.ParamByName('a1').AsString := Query1.FieldByName('a1').AsString;Query2.ParamByName('a2').AsString := Query1.FieldByName('a2').AsString;......Query2.ParamByName('aN').AsString := Query1.FieldByName('aN').AsString;Query2.ExecSQL
      

  11.   

    谢谢hongama,你的思路我也想过啊,可是很不幸的是我对数据库只有读取权限,没办法建自己的表,郁闷中~~
    大家有用过ODAC的么?其中有个TVirtualTable,但我不会用,它好像是可以建立一张虚拟表在内存中,请知道的朋友帮我顶一下
      

  12.   

    先把Query的查询结果插入临时表中。
    再丛临时表中读取时进行排序
      

  13.   

    你试一下insert into #table 看看有没有临时表权限
      

  14.   

    rourouws79,谢谢支持啊,可能大家以后也会遇到同样的问题吧,只要大家有更好的办法,分数不是问题啊
      

  15.   

    计算字段的值是在本地内存中吗?我把含有计算字段的Query中的数据转入一张新表时,计算字段就转移不过去,这是为什么啊?那计算字段的值怎么存回数据库啊?
      

  16.   

    计算字段不存入数据库的,它是在dbgrid的滚动条移动的时候才计算的,你可以用语句跟踪以下
      

  17.   

    呵呵,你不会用数据集来做啊...你每一次查询完都是有数据集在本地的..
    完全可以用数据集排序完再放到GRID里面啊..呵呵..
      

  18.   

    dataset刚刚激活的时候计算字段并没有被计算,只有访问到dataset的数据记录时才会就算,而且每次访问都会重新计算...你可以在计算事件中加入断点或计数器,然后不停的next...first这就有了问题:不被访问到的记录,如dbgrid格子外面的数据,他的计算字段delphi自己也还不知道,(即使计算过了,之后记录上的指针由被移开),delphi怎么对他排序?好像是不可能的事情。
      

  19.   

    谢谢jinjazz的分析,可是还是找不到一个可行的解决办法啊。那用临时表怎么做呢?其中的计算字段能存到临时表中么?
      

  20.   

    我用过VirtualTable,把Query的结果集copy进去,但只有实际字段能copy过去,计算字段不行。用临时表能么?另外:我怎样可以把计算字段的值存入一张表的指定的实际字段中?
      

  21.   

    var
      Start: Cardinal;   //测试时间
    procedure TForm1.Query1CalcFields(DataSet: TDataSet);
    begin
       query1.FieldByName('ff').AsInteger:=
       query1.fieldbyname('orderid').AsInteger-query1.fieldbyname('employeeid').AsInteger*10;
      end;procedure TForm1.Button2Click(Sender: TObject);
    begin    query1.Close;
        query1.Open;
        query1.First;
        progressbar1.Max:=query1.RecordCount;
        Start := GetTickCount;
        query2.SQL.Clear;
        query2.SQL.Add('truncate table table1');
        query2.ExecSQL;
        query2.SQL.Clear;
        query2.SQL.Add('insert into table1(employeeid,orderdate,ff) values(:p1,:p2,:p3)');
        while not query1.Eof do
        begin
          query2.ParamByName('p1').AsString:=query1.fieldbyname('employeeid').AsString;
          query2.ParamByName('p2').AsString:=query1.fieldbyname('orderdate').AsString;
          query2.ParamByName('p3').AsString:=query1.fieldbyname('ff').AsString;
          query2.ExecSQL;
          progressbar1.StepBy(1);    //---排序进度指示
          query1.Next;
        end;
        query3.Close;
        query3.SQL.Clear;
        query3.SQL.Add('select * from table1 order by ff');
        query3.Open;
        //显示消耗时间
        Label1.Caption := Format('Last operation duration: %d ms', [GetTickCount - Start]);
    end;end.
    sqlserver自带northwind.order 830条纪录用了近2秒(1892ms),如果有上w纪录你的客户是无法忍受的,但是又必须把纪录都走一遍
      

  22.   

    TO:fengyangaaa(风扬):那你是在select语句中把这个增加的字段也包括进来,然后在生成计算字段的同时给这个增加的字段赋值,应该还要把它提交数据库更新是吧?然后再用一个Select语句选择时才能对刚才增加的这个字段进行排序,是这样么?可以具体讲一些吗?谢谢
      

  23.   

    再申明一下,计算字段并不是select的时候就计算出来的,而是再指针指向的时候才计算的,而且每指向一次都回计算一次,不管以前有没有过计算
      

  24.   

    TO:jinjazz 谢谢支持!
    那就是除了建临时表以外就没其他的办法了么?你上面给我留的那段代码是SQL Server的吧,可是我用的数据库是Oracle,不知道怎么改好?我没用过Oracle的临时表啊
      

  25.   

    query2.SQL.Add('insert into table1(employeeid,orderdate,ff) values(:p1,:p2,:p3)');
    请问上句中的冒号是什么意思?
    谢谢!
      

  26.   

    容易得要命...今天早上刚回来试了一下你的问题...
    你新生成的字段是在ADOQUERY里面的吧..
    只要这一句..
    ADOQUERY1.SORT就可以了..这么麻烦做什么..哈..