关于一条SQL语句,不知道怎么写 ( 积分: 50 )

  • 主题发起人 主题发起人 wp231957
  • 开始时间 开始时间
W

wp231957

Unregistered / Unconfirmed
GUEST, unregistred user!
现有一个数据库,数据如下:
wd riqi jieyu
a 1 100
b 1 200
a 1 300
a 1 400
c 1 500
b 2 600
c 2 700
a 2 800
c 2 900
b 2 1000

现在我想取 riqi=1 的wd= a b c 的最后一笔JIEYU的数据
也就是a->jieyu=400
b->jieyu=200
c->jieyu=500

请问,该如何取
 
select wd, jieyu=max(jieyu)
from table
group by wd
 
不对,是最后一笔数据(流水顺序,),,不是MAX 我举的例子可能特殊一些
但不是求最大数据
 
加一个自增列 RECID
select * from table inner join (select wd, riqi,max(recid)
from table
group by wd,qiri) on table.wd=a.wd and table.riqi=a.riqi and table.recid=a.recid
 
你的日期有没时间的?
如果有时间的话就可以这么写:
select b.wd, b.riqi, b.jieyu
from (
select wd, riqi=max(riqi)
from table
group by wd
) as a
join table as b on b.riqi=a.riqi
 
riqi的就是DATE的数据
比如06/06/07 06/07/07 06/08/07 就是 mm/dd/yy的形式

谢谢2位,等我好好看看你们的代码
还有些看不太懂
 
表结构设计不合理, 应该加上时间字段或流水号
 
有流水号字段
 
我这样写不对,大家帮忙看看

query2.Close;
query2.RequestLive:=true;
query2.DatabaseName:='';
query2.SQL.Clear ;
query2.SQL.Text :='select max(id),datew,yu_e,wdmc from "base.DBF" where datew between :dw1 and :dw2 group by id' ;
query2.ParamByName('dw1').Value :=dateof(DateTimePicker6.Date);
query2.ParamByName('dw2').Value :=dateof(DateTimePicker6.Date);
query2.Open ;
datasource1.DataSet :=query2;
dbgrid2.DataSource :=datasource1;
 
select top 1 jieyu from 表 where wd='a' and riqi='1' order by id desc
union
select top 1 jieyu from 表 where wd='b' and riqi='1' order by id desc
union
select top 1 jieyu from 表 where wd='c' and riqi='1' order by id desc
 
用 kukujaky 的可以得到 ID最大的 jieyu 值,应该可以符合你的要求,但是有个前提是你的最后一笔JIEYU的数据ID必须为最大。
 
来自:kukujaky, 时间:2007-6-22 16:45:51, ID:3801947
select top 1 jieyu from 表 where wd='a' and riqi='1' order by id desc
union
select top 1 jieyu from 表 where wd='b' and riqi='1' order by id desc
union
select top 1 jieyu from 表 where wd='c' and riqi='1' order by id desc


来自:无柄叶, 时间:2007-6-22 16:53:17, ID:3801951
用 kukujaky 的可以得到 ID最大的 jieyu 值,应该可以符合你的要求,但是有个前提是你的最后一笔JIEYU的数据ID必须为最大。

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
问题是我的A B C 是 事先不确定的,需要程序自己来筛选的
 
select jieyu from 表
where id in (select max(ID) from 表 where riqi = '1' group by wd);
用这个试试看。
 
可能有点麻烦,但是实现了
function GetSqlString(ACause, ADate: string): string;
const
StrSelect='select top 1 from 表 where wd=%0:s and riqi=%1:s order by id desc';
var
LstCasue: TStringList;
I: Integer;
StrTmp: string;
begin
Result := '';
LstCasue := TStringList.Create;
try
LstCasue.Delimiter := ';';
LstCasue.DelimitedText := ACause;
for I := 0 to Pred(LstCasue.Count) do
begin
if I = 0 then
StrTmp := Format(StrSelect, [QuotedStr(LstCasue.Strings), QuotedStr(ADate)])
else
StrTmp := StrTmp + #13#10 + 'union' + #13#10 + Format(StrSelect, [QuotedStr(LstCasue.Strings), QuotedStr(ADate)]);
end;
Result := StrTmp;
finally
LstCasue.Free;
end;
end;

ShowMessage(GetSqlString('a;b;c', '1'));
 
select jieyu from 表
where id in (select max(ID) from 表 where riqi = '1' group by wd);
用这个试试看。
无柄叶的 答案非常准确
但也感谢其他朋友的帮忙
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
696
import
I
I
回复
0
查看
855
import
I
后退
顶部