2010-03-25 38 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