报名的有可能3到十几家不等,他们的报价要和标底比,每百分之一为一档次,同在百分之一内的几家取个平均值,然后在计算机不同百分区域的平均值.举例说:系统取出data.ADOQuery_jl.RecordCount个单位报名.分别报价为1000,1002,1005,1300,1301,970,971而标底是999那么前面三个报价(1000,1002,1005)和标底比在一个百分之一的区域,把他们三个取出来做个平均值,中间两个(1300,1301)同标底也在同一百分之一内的区域取出来做个平均直,后两个(970,971)再做个平均值.然后再把得出的三个平均值再平均.
高分请教哦.把投标报价按data.ADOQuery_kbjl.fieldbyname('tbbj').asfloat的形式写出来.代码写的越清楚分越高哦.

解决方案 »

  1.   

    不明白'把投标报价按data.ADOQuery_kbjl.fieldbyname('tbbj').asfloat的形式写出来'这句话什么意思
      

  2.   

    也就是用代码写出来,TBBJ.是没个单位的投标报价
      

  3.   


    select value from dbo.TBJG
    /*
    970.0
    971.0
    1000.0
    1002.0
    1005.0
    1300.0
    1301.0
    */select avg(value) from dbo.TBJG group by substring(cast((value/999) as varchar),1,4)/*
    970.5
    1002.3333333333334
    1300.5
    */
      

  4.   

    楼主同志,象你这样最多才十几条记录的情况,一个循环判断足可以满足你的需要了,要知道算法及效率不是绝对的,一个好的算法,对于不同的情况未必就能提高你效率,可能恰恰相反比如对于查找算法(你这里应该也会用到),你能肯定的说顺序查找和二分法查找,谁的效率高吗?这要根据你查找的值来决定
    一个上千万条记录的列表,如果你查找的数值正好在中间,那你是中了彩票了,二分法效率齐高无比,如果你找的数值是列表中的第一个,那么二分法和顺序查找法相比还有效率可言吗你的这个问题完全可以通过sql和存储过程解决,没必要放到delphi里,来找一个所谓的高效率算法,看你是DB2板块的,想必对sql和存储过程应该很熟悉了
      

  5.   


    select value from dbo.TBJG
    /*
    970.0
    971.0
    1000.0
    1002.0
    1005.0
    1300.0
    1301.0
    */select avg(value) from dbo.TBJG group by substring(cast((value/999) as varchar),1,4)/*
    970.5
    1002.3333333333334
    1300.5
    */select avg(t.value) from 
    (select avg(value) as value,1 as thelevel
    from dbo.TBJG 
    group by substring(cast((value/999) as varchar),1,4)) t group by thelevel-- 1091.1111111111111
      

  6.   


    ,楼主,这样的sql你总该会写吧
      

  7.   

    参考代码,不过报价是按整数来的,呵procedure TForm1.btn2Click(Sender: TObject);
    var
      i, j, nSum, nCount: Integer;
      fSum: Double;
      GroupList: array [0..99] of TStringList; //报价分区间
      AvgList: array [0..99] of Double; //每个区间的报价平均值
    begin
      //分组
      for i := Low(GroupList) to High(GroupList) do
        GroupList[i] := TStringList.Create;
      for i := 0 to data.ADOQuery_jl.RecordCount - 1 do
      begin
        j := Trunc(Abs((StrToInt(NumList[i]) / RightNum) * 100 - 100)) - 1;
        GroupList[j].Add(data.ADOQuery_jl.FieldByName('tbbj').AsString);
      end;
      //计算
      for i := Low(GroupList) to High(GroupList) do
      begin
        AvgList[i] := 0;
        if GroupList[i].Count > 0 then
        begin
          nSum := 0;
          for j := 0 to GroupList[i].Count - 1 do
            nSum := nSum + StrToInt(GroupList[i][j]);
          AvgList[i] := nSum / GroupList[i].Count;
        end;
      end;  fSum := 0;
      nCount := 0;
      for i := Low(AvgList) to High(AvgList) do
        if AvgList[i] > 0 then
        begin
          nCount := nCount + 1;
          fSum := fSum + AvgList[i];
        end;
      ShowMessage(FloatToStr(fSum / nCount));  mmo2.Lines.Clear;
      for i := Low(GroupList) to High(GroupList) do
        if GroupList[i].Count > 0 then
          mmo2.Lines.Add(GroupList[i].CommaText)
        else
          mmo2.Lines.Add('...');
    end;
      

  8.   

    本帖最后由 tjianliang 于 2009-06-16 12:06:40 编辑
      

  9.   

    用程序写,可以用树型来处理吖,如0.97 -|                    // 前四位是级别,后四位是平均数  都是用 Double和string互转
          |_970
          |_971
            如 970 /999 得出后到父节点,没有即新建父节点,再把970插入子节点.最后...