求SQL语句(100分)

  • 主题发起人 主题发起人 少爷的拐杖
  • 开始时间 开始时间

少爷的拐杖

Unregistered / Unconfirmed
GUEST, unregistred user!
表C
id,名称,型号,长度
1 aaa aaa1 10
2 bbb bbb1 20
3 ccc ccc1 13
...
表F
id,C_id,缴代管费日期,代管费到期日期,费用
1 1 1994-3-3 1996-3-3 900
2 1 1996-4-4 1998-4-4 900
3 1 1998-5-5 2000-5-5 900
4 2 1996-6-6 1998-6-6 800
5 2 1998-12-2 2000-12-2 800
....
希望得到
id 名称 型号 长度 缴代管费日期 代管费到期日期 费用
1 aaa aaa1 10 1998-5-5 2000-5-5 900
2 bbb bbb1 20 1998-12-2 2000-12-2 800
....
根据表F的缴代管费日期选出最新的记录,其中表F的C_id字段对应的是表C的id
我试了很久,好像很难一句得到结果.
 
Deyan:拜托.......要根据表F的时间字段来选择,不是一咕脑都出来,不然
我也会.
完颜:搞不定我去你家搬电脑换饭吃:(
 
少爷的拐杖,在where 后加条件 缴代管费日期 between .... and ....
 
呵,这种问题怎不么不找我??
你把 缴代管费日期这是什么数据类型的说出来,马上给你写出来:)
 
天真:是日期型datetime
数据库是sql7
 
刚才写的错了,改了一下~
不过有天真大侠在,也没我什么事了~:)
 
我搞顶:不要和我枪~
select c.id,c.名称,c.型号,c.长度,f.缴代管费日期,f.代管费到期日期,f.费用
from c,f,(select max(缴代管费日期) as 缴代管费日期,C_id from f group by C_id) b
where
C_id=c.id
f.缴代管费日期=b.缴代管费日期
f.C_id=c.id
 
多表查询
select t2.id,t1.名称,t1.型号,t1.长度,t2.缴代管费日期,t2.代管费到期日期,t2.费用
from t1,t2 where .....group by t2.id
t1.id=t2.id
 
呵,请接招
select c.id as id,a.名称 as 名称,c.型号 as 型号, c.长度 as 长度, convert(datetime,a.缴代管费日期) as 缴代管费日期,
convert(datetime,a.缴代管费日期) as 代管费到期日期,a.费用 as 费用
from
(SELECT C_id,费用, MAX(CONVERT(float, 缴代管费日期)) AS 缴代管费日期
FROM F
GROUP BY c_id,费用) a,C c
where a.C_ID=c.id
先试试,不行再跟我说:)
 
学习一下
 
SELECT 表C.*, tempt2.缴代管费日期 AS Expr1, tempt2.代管费到期日期 AS Expr2,
tempt2.费用 AS Expr3
FROM 表C INNER JOIN
(SELECT 表F.*
FROM 表F INNER JOIN
(SELECT MAX(表F.缴代管费日期) AS maxstime, c_id
FROM 表F
GROUP BY c_id) tt2 ON 表F.c_id = tt2.c_id AND
表F.缴代管费日期 = tt2.maxstime) tempt2 ON 表C.id = tempt2.c_id
测试通过!!!!!
 
天真:
select Cable.id as id,Cable.电缆名称 as 名称,Cable.型号 as 型号, Cable.长度 as 长度,
convert(datetime,Cable_Fund_Situation.代管费交付时间) as 代管费交付时间,
convert(datetime,Cable_Fund_Situation.代管费到期时间) as 代管费到期时间,
Cable_Fund_Situation.费用 as 费用
from
(SELECT 所属电缆, 费用,MAX(CONVERT(float, 代管费交付时间)) AS 代管费交付时间 FROM
Cable_Fund_Situation
GROUP BY 所属电缆,费用) tmp,cable,Cable_fund_situation
where tmp.所属电缆=cable.id
得到的结果不正确:多条记录的的确按最新的日期提取,可是只有一条记录的却提出多条来啦
 
select c.id ,c.名称 c.型号, c. 长度,max(f.缴代管费日期), max(f.代管费到期日期),f. 费用
from c ,f
where c.id=f.c_id
group by c.id ,c.名称 c.型号, c. 长度,f. 费用
 
下午再帮你看看!
晕,谁叫你用三个表的?这样当然会出错!
建议:
三个表最好并成两个表
 
ugvanxk:如果两年缴纳的费用不同,会都列出来,我只需要最新的记录.
 
天真:是两个表啊.
cable表
id,电缆名称,型号,截面,长度
cable_fund_situation表
id,所属电缆,代管费交付时间,代管费到期时间,费用
只要得到:
两个表全部的字段,并且如果表2所属电缆字段相同的取出代管费交付时间最新的一个记录
麻烦您多看看.
 
select Cable.id as id,Cable.电缆名称 as 名称,Cable.型号 as 型号, Cable.长度 as 长度,
convert(datetime,Cable_Fund_Situation.代管费交付时间) as 代管费交付时间,
convert(datetime,Cable_Fund_Situation.代管费到期时间) as 代管费到期时间,
Cable_Fund_Situation.费用 as 费用
from
(SELECT 所属电缆, 费用,MAX(CONVERT(float, 代管费交付时间)) AS 代管费交付时间 FROM
Cable_Fund_Situation
GROUP BY 所属电缆,费用) tmp,cable,Cable_fund_situation
where tmp.所属电缆=cable.id and Cable_fund_situation.所属电缆=cable.id
 
天真:执行后结果不对:(
表Cable_Fund_Situation内容如下:
id 所属电缆 代管费交付时间 代管费到期时间 费用 用户名称
----------- ---------- ---------------------------------------------------- --------------------- ----------------------------------------
1 6 2002-04-22 2004-04-22 100.0000 NULL
2 6 2000-12-30 2003-04-22 200.0000 NULL
3 6 2002-12-30 2005-04-22 300.0000 NULL
4 13 2005-12-30 2008-04-22 400.0000 NULL
5 12 2000-12-30 2003-04-22 500.0000 NULL
查询结果变成:
id 名称 型号 长度 代管费交付时间 代管费到期时间 费用
----------- -------------------- ------------------------------ ----------- --------------------------- --------------------------- ---------------------
6 省电力局 YJV22-×8.7 234 2002-04-22 00:00:00.000 2004-04-22 00:00:00.000 100.0000
6 省电力局 YJV22-×8.7 234 2002-04-22 00:00:00.000 2004-04-22 00:00:00.000 100.0000
6 省电力局 YJV22-×8.7 234 2002-04-22 00:00:00.000 2004-04-22 00:00:00.000 100.0000
6 省电力局 YJV22-×8.7 234 2000-12-30 00:00:00.000 2003-04-22 00:00:00.000 200.0000
6 省电力局 YJV22-×8.7 234 2000-12-30 00:00:00.000 2003-04-22 00:00:00.000 200.0000
6 省电力局 YJV22-×8.7 234 2000-12-30 00:00:00.000 2003-04-22 00:00:00.000 200.0000
6 省电力局 YJV22-×8.7 234 2002-12-30 00:00:00.000 2005-04-22 00:00:00.000 300.0000
6 省电力局 YJV22-×8.7 234 2002-12-30 00:00:00.000 2005-04-22 00:00:00.000 300.0000
6 省电力局 YJV22-×8.7 234 2002-12-30 00:00:00.000 2005-04-22 00:00:00.000 300.0000
13 21 21 2005-12-30 00:00:00.000 2008-04-22 00:00:00.000 400.0000
12 55 55 55 2000-12-30 00:00:00.000 2003-04-22 00:00:00.000 500.0000
(11 row(s) affected)
'所属电缆'为6的记录重复了
 
呵,明白了!
改用如下!
select Cable.id as id,Cable.电缆名称 as 名称,Cable.型号 as 型号, Cable.长度 as 长度,
convert(datetime,Cable_Fund_Situation.代管费交付时间) as 代管费交付时间,
convert(datetime,Cable_Fund_Situation.代管费到期时间) as 代管费到期时间,
Cable_Fund_Situation.费用 as 费用
from
(select 所属电缆,费用,代管费交付时间,代管费到期时间,用户名胜古迹 from
Cable_Fund_Situation a , (SELECT 所属电缆, 费用,MAX(Id) as id FROM
Cable_Fund_Situation
GROUP BY 所属电缆,费用) tmp where a.id=tmp.id) Cable_Fund_Situation,cable cable
where Cable_Fund_Situation.所属电缆=cable.id
 
Server: Msg 209, Level 16, State 1, Line 1
Ambiguous column name '所属电缆'.
Server: Msg 209, Level 16, State 1, Line 1
Ambiguous column name '费用'.
(名胜古迹已经改过)
天真:您再看看吧,再不行我就放弃一步到位的想法.用Max后对字段的要求太苛刻了.
真不好写.
 
后退
顶部