如题:
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语句要如何写?或有什么别的办法
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语句要如何写?或有什么别的办法
解决方案 »
- 怎么读这个二进制文件啊
- 欢迎大家光临我的编程小站
- 如何将TComm收到的数据由BCD码转换为十进制整数
- ADODateSet 的问题(DELPHI新手)
- 请问大家的职称(就是名片上...),谢谢!分不够再加!!!
- ExpressQuantumGrid中的cxDrid表头上面的Drag a column header here to group by that column如何改写成中文的提示呢
- 奇怪的问题!我做了一个适应分辨率的程序!代码如下:帮忙分析一下!!!
- 继续求图片写入数据库的例子!!!在线等待!!!
- *******我有一个join来的数据集,用Tdbgrideh来关联,但在编辑时出问题了******
- ListView问题!
- 请教一个cxGrid中LookupComboBox的问题
- win7下如何用代码打开网页
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()等函数)
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;
用了循环语句搞定了,方法是笨了点。