2010-02-01 117 views
1

我有两个表:SQL Server的条件比较

CREATE TABLE #HOURS 
(DAY INTEGER, 

HOUR整数)

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 

时间显示工作时间和#Persons表明,进入系统每小时基地的人员。 我想找到工作时间与小时表匹配的人员。但他或她可以跳过两个工作小时。

我已经试过这样:

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 

但这只有当没有在同一天不同的人的作品;)

有什么建议?

+0

你想找什么呢? 跳过2个工作时间的人? – 2010-02-01 11:14:13

+0

我修改了我的问题。我不是在找船长。这是一种匹配。 “匹配记录”,但有一个灵活性,你可以错过两个记录。 – fkucuk 2010-02-01 11:22:42

回答

0

我想你的意思是,一天,人的每一种组合,你想退货,如果有效时间是此人在这一天的工作数量为2小时数内当天存在的有效小时数。如果是这样,这应该是诀窍:

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

我试图避免使用“每天总工时”。我不知道为什么;) 这很好,非常感谢。 – fkucuk 2010-02-01 12:41:14

0

我认为你还需要进一步澄清你期望的结果。同时,这会让你开始吗?

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