2009-10-28 7 views
0

Utilisation de SQL Server 2005Comment afficher une valeur pour les dates?

Database1

Tableau 1

ID Date Status 

001 23-02-2009 Worked 
001 24-02-2009 
001 25-02-2009 
001 26-02-2009 Worked 
002 24-02-2009 Worked 
002 25-02-2009 
002 26-02-2009 
002 27-02-2009 
002 28-02-2009 Worked 

...,

Database2

Tableau 2

ID FromDate ToDate Reason 

001 24-02-2009 25-02-2009 ShortLeave 
002 25-02-2009 27-02-2009 MedicalLeave 

...,

Essayé Recherche

SELECT DISTINCT t1.ID, 
t1.Date, 
CASE WHEN t2.ID IS NULL THEN t1.Status ELSE 'Leave' END AS Workedtime  
from Database1.dbo.table1 AS t1 LEFT OUTER JOIN Database2.dbo.table2 AS t2 
ON t1.ID COLLATE DATABASE_DEFAULT = t2.ID 
AND t1.Date BETWEEN t2.FromDATE AND t2.ToDATE 

Il doit afficher une raison de table2 au lieu de congé

Sortie

prévue ID Statut Date de

001 23-02-2009 Worked 
001 24-02-2009 ShortLeave 
001 25-02-2009 ShortLeave 
001 26-02-2009 Worked 
002 24-02-2009 Worked 
002 25-02-2009 MedicalLeave 
002 26-02-2009 MedicalLeave 
002 27-02-2009 MedicalLeave 
002 28-02-2009 Worked 

. ..,

Il devrait donc afficher une raison au lieu de quitter où table1.id = table2.id et t1.date entre t2.fromdate et t2.todate.

Comment modifier ma requête?

Besoin de requête Aide

+0

Dans le tableau 2, si l'ID de la deuxième entrée est 002? –

Répondre

3

votre propre requête était presque là, vous avez juste besoin d'utiliser la colonne Reason de Table2 quand il est disponible:

SELECT t1.ID, t1.Date, ISNULL(t2.Reason, t1.Status) AS WorkedTime 
FROM Table1 AS t1 
    LEFT JOIN Table2 AS t2 
     ON t1.ID COLLATE DATABASE_DEFAULT = t2.ID 
      AND t1.Date BETWEEN t2.FromDate AND t2.ToDate 
ORDER BY t1.ID, t1.Date 
+0

Affichage de l'erreur "impossible de résoudre le conflit de classement" – Gopal

+0

Hmm, il semble que vous ayez besoin du 'COLLATE' de votre requête d'origine. Je vais modifier ma réponse. – LukeH

+0

J'utilise déjà un COLLATE DATABASE_DEFAULT, mais il montre la même erreur. – Gopal

Questions connexes