上午一同事问我一问题:有一个表中存有卡号和此卡的所有消费记录,怎么用一句简单的sql语句取出每张卡的最新一条记录然后用卡号去和别的表关联?
表示例(tb):
cardNO CDate money ...(其他字段)
001 2012-01-01 100.00
001 2012-01-02 208.00
002 2012-01-02 15.00
003 2012-01-03 200.00
001 2012-02-02 12.15
003 2012-06-06 0.01
我乍一听,说:吆,这个问题挺纠结,用游标比较方便,可是表里有20+W条记录,效率不会很高,可是仔细一想,SQL Server里的 varchar ,date 等可以用min( ),max( )啊,这样问题就简单多了。
select cardNo,max(CDate) from tb group by cardNo;
然后用查询结果的cardNo和其他表去关联。
中午吃完饭看优快云的论坛,在SQL Server大区,正好看见一个类似的问题。
问题如下:
一个报价表tb1:
字段:
id 自动编号(主键)
wuliaoName 物料名称
gongid 供应商
price 价格
date 日期
id wuliaoName gongid price date
1 W1 G1 500 2012-7-1
2 W2 G2 200 2012-7-2 ----
3 W2 G5 300 2012-7-2 ----
4 W1 G1 399 2012-7-3 ----
5 W1 G3 100 2012-7-4 ----
7 W3 G4 600 2012-7-4
8 W3 G4 300 2012-7-5 ----
现在需要找到不同物料,不同供应商,最后日期价格,然后全部显示到页面上。
比如,表中需要显示后面有红色标记都要显示,现在要确保 1.物料一样,供应商不同要显示, 2.物料 和 供应商 一致的选最后日期。
需要的结果:
id wuliaoName gongid price date
2 W2 G2 200 2012-7-2 ----
3 W2 G5 300 2012-7-2 ----
4 W1 G1 399 2012-7-3 ----
5 W1 G3 100 2012-7-4 ----
8 W3 G4 300 2012-7-5 ----
他这个问题和我同事那个问题有2个地方不同,①他的是两个字段确定唯一性(类似联合主键)②需要显示本表中其他的字段而不是去关联其他表,其实这个差不多。
我给出的方案是:
select t1.wuliaoName,t1.gongid,t1.price,t1.date from tb1 t1,
(select wuliaoName,gongid,max(date) as date from tb1 group by wuliaoName,gongid) t2
where t1.wuliaoName = t2.wuliaoName and t1.gongid = t2.gongid and t1.date = t2.date;
先以物料名称,供应商为唯一约束(group by wuliaoName,gongid)求出最后的时间,然后和本表以物料、供应商以及最后的时间为条件联接。
当然原贴中还有大神的解决方案,大家可以去原帖看看,这里我就不详细说了。