2011-07-22 5 views
0

La requête d'origine:sql suppression de données de colonne supplémentaire

7/20/2011 I 
7/20/2011 O 
7/19/2011 I 
7/18/2011 O 
7/17/2011 I 

I = Heure d'arrivée alors que O = VÉRIFIER

alors je fais une requête pour séparer I et O de sorte qu'il sera de retour comme celui-ci

select 
    case when CHECKTYPE='I' then checktime else 0 end as 'Check in', 
    case when CHECKTYPE='O' then checktime else 0 end as 'Check Out', 
    CHECKTYPE,BadgeNo,EmpName 
from 
    Checkinout 
where 
    and checktime BETWEEN '07/17/2011' and '07/26/2011' and EmpName = 'ASIDOY,' and BadgeNo <> '1900-01-01 00:00:00.000' 
group by 
    checktime,CHECKTYPE,BadgeNo,EmpName 

Résultat

Check IN Check out Status 
7/17/2011 1/1/1900 I 
1/1/1900 7/18/2011 O 
7/19/2011 1/1/1900 I 
1/1/1900 7/20/2011 O 
7/20/2011 1/1/1900 I 

Mais j'ai un problème que la requête crée met (1/1/1900) afin de remplir tous les espaces et je veux le supprimer. Mais je ne sais pas comment écrire la requête pour cela, afin de revenir comme ça.

Check In Check Out 
7/17/2011 7/18/2011 
7/19/2011 7/20/2011 
7/20/2011 7/21/2011 
+0

de publier les requêtes que vous utilisez, qui aideront les gens à vous donner une solution. – sudmong

+0

Vous devez inclure un certain ddl (data definition lang) et des exemples de données - il semble que vous ayez besoin d'une auto-jointure, mais je ne peux pas dire sur quoi. – jmoreno

+0

D'où vient l'heure de départ magique dans la troisième rangée de votre résultat souhaité? –

Répondre

2

essayez la requête suivante

select 
    case when CHECKTYPE='I' then checktime end as Check in, 
    case when CHECKTYPE='O' then checktime end as Check Out, 
    CHECKTYPE,BadgeNo,EmpName 
from 
    Checkinout 

il retournera NULL pour les colonnes vides

+0

Nope il retournera NULL .. au lieu de 01/01/1900 .. il renverra NULL .. question suivante Comment supprimer NULL pour ma requête sera 18/07/2011 remonter – mapet

0

En supposant qu'il ya toujours un chèque avant un « correspondant » de vérifier, et ne pas savoir comment pour faire face à la sortie manquante pour la troisième ligne de votre résultat encore ...

Vous devez joindre ensemble les lignes qui h vous souhaitez ajouter des valeurs de colonne à la sortie finale. Ça va être quelque chose comme ceci:

SELECT 
    ci.checktime, 
    co.checktime 
FROM 
    CheckInOut ci 
     inner join 
    CheckInOut co 
     on 
      ci.checktime < co.checktime 
     left join 
    CheckInOut co_anti 
     on 
      ci.checktime < co_anti.checktime and 
      co_anti.checktime < co.checktime and 
      co_anti.checktype = 'o' 
WHERE 
    ci.checktype = 'i' and 
    co.checktype = 'o' and 
    co_anti.checktime is null 

Nous joindre à la table elle-même 3 fois afin d'assurer que la ligne de co qui correspond contre la ligne de ci est la première telle ligne qui pourrait correspondre.

Je n'ai pas inclus les autres colonnes ou les conditions à ce stade, parce que je voulais juste me concentrer sur ce qui est nécessaire pour obtenir les colonnes affichées dans le résultat souhaité. Vous pouvez adapter le ci-dessus pour l'adapter à vos autres exigences.

+0

j'essaie cette requête, mais la caisse est correct et check_In est faux – mapet

+0

@mapet - faux * comment *? Je ne peux pas corriger ma requête pour "faux" –

Questions connexes