2013-06-12 6 views
0

J'ai une table qui a logtime pour l'utilisateur avec le statut comme 1 & 2. Si le statut est 1 puis dans le temps de logIn et si le statut est 2 alors est le temps de logOut. Donc, je veux afficher le journal & Heure de sortie de l'utilisateur.Comment fusionner deux lignes en une pour vérifier l'état

Si elle n'a pas de déconnexion, la valeur de la colonne doit être nulle.

Voici une Sample Demo sur la structure de la table et la requête ...

je reçois le temps de fermeture de session à afficher pour tous les temps LOGIN ......

Je veux la sortie comme:

CLOCKIN  CLOCKOUT 
9:25:41 AM 9:30:41 AM 
9:35:41 AM 9:40:41 AM 
9:45:41 AM 
10:06:33 AM 2:59:51 PM 

Répondre

1

Vous pouvez le faire avec deux sous-requêtes corrélées:

SELECT CONVERT(NVARCHAR(20),cin.logtime,108) AS CLOCKIN 
     ,CONVERT(NVARCHAR(20),(SELECT MIN(cout.logtime) 
           FROM table1 cout 
           WHERE cin.logtime < cout.logtime 
           AND cout.statusId = 2 
           AND NOT EXISTS (SELECT * FROM table1 cin2 
               WHERE cin2.logtime > cin.logtime 
               AND cin2.logtime < cout.logtime 
               AND cin2.statusId = 1 
               ) 
           ),108) AS CLOCKOUT 
FROM table1 cin 
WHERE cin.statusId = 1 

La plupart requête externe obtient tous les checkings, premier sous-requête (externe) obtient le checkout minimal après le checkin, et deuxième sous-requête (le plus interne) juste des chèques s'il y avait un checkin après - pour faire NULL dans la troisième rangée au lieu de dupliquer 14:59

SQLFiddle Demo

+0

Cela fonctionne bien .... Merci beaucoup ... – Renuka

0

Utiliser le style 22 pour CONVERT fonction:

select convert (varchar (20), cast (getdate() as time) , 22) 

ou insérez tout simplement dans votre code:

convert (varchar (20), cast (rt.rt.logTime as time), 22) 
,convert (varchar (20), cast (rt1.rt.logTime as time), 22)