日期:2014-05-17  浏览次数:20553 次

求用sql或者存储过程写出要求查询
zkzh(准考证号,共12位) xm(姓名) sfzh(身份证号)
030603101423 周光辉 440803780508111
040105101423 周光辉 440803780508111
060210101423 周光辉 440803780508111
040112101423 周光辉 440803780508111
010101109425 陈娟 450202801201002
010110109425 陈娟 450202801201002
010112109425 陈娟 450202801201002
010101108179 张三 350181820728326

提示:同一个姓名及身份证号可能对应一个或者多个准考证号(zkzh)。
要求:
1、 当有姓名及身份证号对应的只有一个准考证号(zkzh)时,则查询出该条信息
2、 当姓名及身份证号对应多个准考证号(zkzh)时,只需查出其中一个准考证号(这里要注意了:要求:该准考证号的第5到第6两位(表中标记红色值)对应的数值是相同姓名及身份证号对应的几个准考证号中最大值)对应的信息。

(即如果有多个准考证号的话就只要第5第6两位数值是最大的准考证号,最后要求是每个身份证号+姓名只对应有一个准考证号)



(要求查询结果)
zkzh(准考证号,共12位) xm(姓名) sfzh(身份证号)
040112101423 周光辉 440803780508111
010112109425 陈娟 450202801201002
010101108179 张三 350181820728326


如觉得题意不明,请提出来。谢谢

------解决方案--------------------
SQL code

--zkzh(准考证号,共12位) xm(姓名) sfzh(身份证号)
select *
from tb t
where not exists (select 1 from tb where xm=t.xm and sfzh=t.sfzh
        and convert(int,substring(zkzh,5,2)) > convert(int,substring(t.zkzh,5,2)))

------解决方案--------------------
SQL code
select * from test a where 
right(LEFT(a.zkzh,6),2)=( select max(right(LEFT(B.zkzh,6),2))  from test b where a.xm =b.xm and a.sfzh =b.sfzh )

------解决方案--------------------
SQL code
select * from test a where 
SUBSTR(a.zkzh,5,2)  =( select SUBSTR(b.zkzh,5,2)  
from test b where a.xm =b.xm and a.sfzh =b.sfzh )