日期:2014-05-18  浏览次数:20503 次

表的查询
如某单位有两个区域A、B,某人员甲、乙刷卡流水如下:
乙   12:00:00   出   B
乙   12:20:00   出   A
甲   13:00:00   进   A
甲   13:30:00   进   B
乙   13:42:00   进   A
乙   15:00:00   出   A
甲   15:35:00   出   B
那查询A区域情况,
编号   姓名   班级   性别   最后刷卡时间   在校情况
            甲                           13:00:00       区域内
            乙                           15:00:00       区域外

查询B区域情况,
编号   姓名   班级   性别   最后刷卡时间   在校情况
            甲                           15:35:00       区域外
            乙                           15:00:00       区域外


------解决方案--------------------
create table #(uName nvarchar(10),uDatetime Datetime,state nvarchar(10),flag nvarchar(10))
insert into # select '乙 ', '2007-08-16 12:00:00 ', '出 ', 'B '
insert into # select '乙 ', '2007-08-16 12:20:00 ', '出 ', 'A '
insert into # select '甲 ', '2007-08-16 13:00:00 ', '进 ', 'A '
insert into # select '甲 ', '2007-08-16 13:30:00 ', '进 ', 'B '
insert into # select '乙 ', '2007-08-16 13:42:00 ', '进 ', 'A '
insert into # select '乙 ', '2007-08-16 15:00:00 ', '出 ', 'A '
insert into # select '甲 ', '2007-08-16 15:35:00 ', '出 ', 'B '

--A
select b.uName,b.uDatetime,state = (case b.state when '出 ' then '区域外 ' else '区域内 ' end)
from (
select uName,uDatetime = max(uDatetime)
from # where flag = 'A ' group by uName) a
left join # b on a.uName= b.uName and a.uDatetime = b.uDatetime

--B
select b.uName,b.uDatetime,state = (case b.state when '出 ' then '区域外 ' else '区域内 ' end)
from (
select uName,uDatetime =
(case when max(uDatetime) > (select uDateuDatetime = max(uDatetime) from # where flag = 'A ' and uName = a.uName)
then max(uDatetime) else (select uDateuDatetime = max(uDatetime) from # where flag = 'A ' and uName = a.uName) end)
from # a where flag = 'b ' group by uName) a
left join # b on a.uName= b.uName and a.uDatetime = b.uDatetime