日期:2014-05-16  浏览次数:20683 次

sql统计遇到的难题
人事管理系统.举例就拿一张学历表来说吧.表里记录了职工的学历变迁情况    
 
表名:pstudy    
 
工号     学历    取得学历时间    
 
1      专科     1997    
 
1      本科                     2000    
 
2      本科                       2001    
 
3      本科                       1998    
 
3      硕士                       2002    
 

 
我想统计目前职工中最高学历是本科的职工,怎么样把时间因素也考虑进去呢,取出同个工号的最近的那条数据?具体sql语句请高手赐教,我用mysql.    
结果是2

------解决方案--------------------
为什么是2,而不是1,2
------解决方案--------------------
没明白~~
------解决方案--------------------
是这个意思
select id,edu,min(year(now())-edutime) as t from pstudy where edu = '本科 'group by edutime order by t limit 1

得到
id edu t
----- ------ ----
2 本科 6
------解决方案--------------------
mysql> SELECT * FROM pstudy WHERE `学历`= '本科 ' ORDER BY `取得学历时间` DESC LIMIT 1;
+------+------+--------------+
| 工号 | 学历 | 取得学历时间 |
+------+------+--------------+
| 2 | 本科 | 2001 |
+------+------+--------------+
1 row in set (0.02 sec)
------解决方案--------------------
不懂 UP
------解决方案--------------------
学历是本科的,最近的记录是2001 的这个,但是count(*) 怎么会是2??
时间是什么考虑的?
------解决方案--------------------
那应该是我想那样吧,最后应该是工号是1和2的,count(*)就等于2了?哈哈
------解决方案--------------------
CREATE TABLE #T (工号 NVARCHAR(10), 学历 NVARCHAR(10), 取得学历时间 INT)
INSERT INTO #T
SELECT '1 ', '专科 ', 1997
UNION SELECT '1 ', '本科 ', 2000
UNION SELECT '2 ', '本科 ', 2001
UNION SELECT '3 ', '本科 ', 1998
UNION SELECT '3 ', '硕士 ', 2002
SELECT * FROM #T

SELECT a.工号, a.学历,a.取得学历时间
FROM #T a
INNER JOIN (SELECT MAX(取得学历时间) AS 取得学历时间, 工号 FROM #T GROUP BY 工号) b ON a.工号 = b.工号 AND a.取得学历时间 = b.取得学历时间
WHERE a.学历 = '本科 '


DROP TABLE #T