Tsql SQL Server条件比较

Tsql SQL Server条件比较,tsql,compare,Tsql,Compare,我有两张桌子: CREATE TABLE #HOURS (DAY 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 V

我有两张桌子:

CREATE TABLE #HOURS
(DAY 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
小时显示工作时间,人员显示按小时进入系统的人员。 我想找工作时间与工时表相符的人。但他或她可以跳过两个工作小时

我试过这个:

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
但这只有在同一天没有不同的人时才有效


有什么建议吗?

我想你还需要进一步澄清一下你对结果的期望。同时,这能让你开始吗

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

我认为你的意思是,对于每一天和每一个人的组合,如果该人在该天工作的有效小时数在该天存在的有效小时数的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

那你想找什么?那些跳过超过2个工作小时的人?我已经修改了我的问题。我不是在找船长。这是一种匹配。匹配记录,但有一个灵活性,你可以错过两个记录。我试图避免使用总工作时间一天。我不知道为什么;很好用,非常感谢。