2010-03-25 40 views
0

HI 我正在寻找一些帮助,我似乎无法得到我的头如何自我加入工作。我有这个sql代码SQL SERVER 2005自加入输出

select Persno'Name',convert(char(20), A_Date , 13)'Logins',acode 
from atrail as LOGIN 
where acode = 'LOGIN' OR acode = 'LOGOUT' 
order by a_date desc 

它产生一个用户名列表以及何时登录和注销。我试图达到的目标是让他们登录日期旁边的LOGOUT日期,以便让他们看到他们登录和注销时的日期。

感谢

安迪

+0

你应该检查格式和拼写。 – 2010-03-25 14:18:49

+1

也是,要求不明确。你想查看每个用户的登录和相关注销列表吗?你能否给我们表格定义,以便我们可以看到还有哪些其他列必须使用? – ninesided 2010-03-25 14:27:07

+0

除了下一个注销事实之外,还有哪些注销与其登录关联?你有一个sessionid或类似的东西吗? – AllenG 2010-03-25 14:31:59

回答

0

这可能是另一种方式来实现这一目标:

SELECT Name, [LOGIN] as login_date, [LOGOUT] as logout_date 
FROM 
(
    SELECT Persno Name,convert(char(20), A_Date , 13) Logins, acode 
    FROM atrail 
    WHERE acode = 'LOGIN' OR acode = 'LOGOUT' 
    ORDER BY a_date DESC 
) AS login_table 
PIVOT 
(
    MAX(Logins) FOR acode IN ([LOGIN],[LOGOUT]) 
) AS pvt_table 
ORDER BY login_date DESC 

这是考虑到每个登录日期都有一个注销日期,每个人只有一个登录和一个注销行。

2

这应做到:

select  LOGIN.Persno AS Name, 
      LOGIN.a_date AS login_date, --//convert here as you like 
      LOGOUT.a_date AS logout_date --//convert here as you like 

from  atrail as LOGIN 

left join atrail as LOGOUT 
     ON LOGOUT.Persno= LOGIN.Persno 
     AND LOGOUT.acode = 'LOGOUT' 

     AND LOGOUT.A_Date= (SELECT TOP 1 x.A_Date 
          FROM atrail x 
          WHERE x.Persno = LOGIN.Persno 
           AND x.A_Date >= LOGIN.A_Date 
           AND x.acode = 'LOGOUT' 
          ORDER BY x.A_Date) 
where  LOGIN.acode = 'LOGIN' 
order by LOGIN.a_date desc 

会产生格式结果:

Name  login_date logout_date 
----------- ----------- ----------- 
pippo  2008-01-01 2008-01-03 
+0

这就是非常感谢的工作。 – andy 2010-03-25 15:24:09