2010-02-01 5 views
1

J'ai deux tables:conditionnelle SQL Server comparaison

CREATE TABLE #HOURS 
(DAY INTEGER, 

HEURE Integer)

CREATE TABLE #PERSONS 
(DAY INTEGER, HOUR INTEGER, 
Name NVARCHAR(50)) 
GO 

INSERT #HOURS VALUES (1, 5) 
INSERT #HOURS VALUES (1, 6) 
INSERT #HOURS VALUES (1, 8) 
INSERT #HOURS VALUES (1, 10) 
INSERT #HOURS VALUES (1, 14) 
INSERT #HOURS VALUES (1, 15) 
INSERT #HOURS VALUES (1, 16) 
INSERT #HOURS VALUES (1, 17) 
INSERT #HOURS VALUES (1, 18) 


INSERT #PERSONS VALUES (1, 5, 'Steve') 
INSERT #PERSONS VALUES (1, 6, 'Steve') 
INSERT #PERSONS VALUES (1, 7, 'Steve') 
INSERT #PERSONS VALUES (1, 8, 'Steve') 
INSERT #PERSONS VALUES (1, 10, 'Steve') 
INSERT #PERSONS VALUES (1, 14, 'Steve') 
INSERT #PERSONS VALUES (1, 15, 'Steve') 
INSERT #PERSONS VALUES (1, 16, 'Steve') 
INSERT #PERSONS VALUES (1, 17, 'Steve') 

INSERT #PERSONS VALUES (1, 10, 'Jim') 
INSERT #PERSONS VALUES (1, 11, 'Jim') 
INSERT #PERSONS VALUES (1, 12, 'Jim') 
INSERT #PERSONS VALUES (1, 13, 'Jim') 

GO 

Heures montre les heures de travail et #personnes montre les personnes qui sont entrées dans le système de la base horaire. J'aimerais trouver les personnes dont les heures de travail correspondent à la table des heures. Mais il peut passer deux heures de travail.

J'ai essayé ceci:

select t.Day, sum(t.Nulls) 
from 
(select h.Hour, h.Day 
     , Case 
      WHEN p.Hour is null Then 1 ELSE 0 END Nulls 
from #HOURS h 
left join #PERSONS P on h.Hour = p.Hour AND h.Day = p.Day) t 
group by t.Day 
HAVING sum(t.Nulls) < 2 

Mais cela ne fonctionne que lorsqu'il n'y a pas différentes personnes le même jour;)

Toutes les suggestions?

+0

Qu'est-ce que vous essayez de trouver alors? Les personnes qui ont sauté plus de 2 heures de travail? –

+0

J'ai révisé ma question. Je ne cherche pas les skippers. C'est une sorte de correspondance. "Faites correspondre les enregistrements" mais il y a une flexibilité que vous pouvez manquer deux enregistrements. – fkucuk

Répondre

0

Ce que je pense que vous voulez dire est que pour chaque combinaison de jour et par personne, vous voulez le retourner si le nombre d'heures valides que cette personne a travaillé ce jour-là est dans les 2 heures le nombre de heures valides que existent pour ce jour. Si oui, cela devrait faire l'affaire:

SELECT 
    Day 
    , Name 
    , HoursWorked 
    , HoursInDay 
FROM (
    SELECT 
     p.Day 
     , p.Name 
     , COUNT(*) HoursWorked 
     , (SELECT COUNT(*) FROM #Hours H2 WHERE H2.Day = P.Day) HoursInDay 
    FROM 
     #Persons P INNER JOIN #Hours H 
      ON P.Day = H.Day And P.Hour = H.Hour 
    GROUP BY 
     p.Day, p.Name 
    ) Data 
WHERE 
    HoursWorked + 2 >= HoursInDay 
+0

J'essayais d'éviter d'utiliser "heures de travail totales par jour". Je ne sais pas pourquoi;) Ça marche bien, merci beaucoup. – fkucuk

0

Je pense que vous avez encore besoin de clarifier un peu plus loin ce que vous attendez en conséquence. En attendant, est-ce que cela vous aiderait à démarrer?

SELECT p.DAY, p.Name, WORKED = COUNT(*), WORKHOURS = AVG(hc.WORKHOURS) 
FROM  #PERSONS p 
      INNER JOIN #HOURS h ON h.DAY = p.DAY AND h.HOUR = p.HOUR 
      LEFT OUTER JOIN ( 
      SELECT DAY, WORKHOURS = COUNT(*) 
      FROM  #HOURS 
      GROUP BY DAY 
     ) hc ON hc.DAY = p.DAY 
GROUP BY p.DAY, p.Name 
Questions connexes