如题:
prd_no    prd_
1         B10
1         B11
1         B12
3         D6
3         D7
6         U10
如上表,prd_no作为条件,查询结果可能有0、1、2、3、4、5、6等若干条,设记录条数为n,若n为偶数则取第n/2条记录的结果,若n为奇数则取第(n+1)/2条记录的结果,sql语句要如何写?或有什么别的办法

解决方案 »

  1.   

    declare @Half int
    select  @Half=(count(*)+1)/2 from TableName order by prd_no,prd_
    exec('
    select top 1*  from (select top  '+@Half+'   * from TableName order by prd_no,prd_
    ) a order by prd_no desc,prd_ desc
    ')
    上面是个比较通用的办法,如果你的MSSQL是2005以上版本的话,是可以有更简单办法的(用Row_NUMBER()等函数)
      

  2.   

    procedure Toffermain.N2Click(Sender: TObject);
    var
      a,b,i:Integer;
      p:PChar;
      c:Extended;
    begin
      Data1.of_b_q.Edit;
      DBGrid1.Columns[5].PickList.Clear;
      with Data1.q_dbte do
      begin
        Close;
        SQL.Clear;
        SQL.Text:='select prd_,sum(cst_make+cst_prd+cst_man+cst+cst_out) as cst_all from mf_bom where prd_no='+QuotedStr(Data1.of_b_q.fieldByName('prd_no').AsString)+' group by prd_ order by prd_';
        Open;
        a:=Data1.q_dbte.RecordCount;
      end;
      if a>0 then
      begin
        b:= a mod 2;
        if b=1 then
        c:=(a+1)/2
        else
        c:=(a+2)/2;
        for i:=1 to a do
        begin
          if i=c then
          begin
            Data1.of_b_q.FieldByName('prd_').Value:=Data1.q_dbte.FieldByName('prd_').Value;
            Data1.of_b_q.FieldByName('p_cost').Value:=Data1.q_dbte.FieldByName('cst_all').Value;
            Data1.of_b_q.FieldByName('prd_p').Value:=Data1.q_dbte.FieldByName('cst_all').Value;
            ShowMessage(Data1.of_b_q.FieldByName('prd_').AsString);
          end;
          //DBGrid1.Columns[6].PickList.Add(Trim(Data1.q_dbte.FieldByName('prd_').AsString));
          Data1.q_dbte.Next;
        end;
        if (Trim(Data1.q_dbte.FieldByName('prd_').AsString)='') and (i=1) then
        begin
          p:=PChar('款号:'+Trim(Data1.of_b_q.fieldByName('prd_no').AsString)+' 查询到 '+IntToStr(a)+' 个无指围BOM表');
          Application.MessageBox(p,'提示:',0+64);
        end
        else
        begin
          p:=PChar('款号:'+Trim(Data1.of_b_q.fieldByName('prd_no').AsString)+' 查询到 '+IntToStr(a)+' 个指围');
          Application.MessageBox(p,'提示:',0+64);
        end;
      end
      else
      begin
        p:=PChar('款号: '+Trim(Data1.of_b_q.fieldByName('prd_no').AsString)+' 无BOM表');
        Application.MessageBox(p,'提示:',0+64);
      end;
    end;
    用了循环语句搞定了,方法是笨了点。