Условное сравнение SQL Server - PullRequest
       9

Условное сравнение SQL Server

1 голос
/ 01 февраля 2010

У меня есть две таблицы:

CREATE TABLE #HOURS
(DAY INTEGER,

ЧАС 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

Часы показывают рабочие часы, а #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

Но это работает только тогда, когда в один и тот же день нет разных людей;)

Есть предложения?

Ответы [ 2 ]

0 голосов
/ 01 февраля 2010

Я думаю, что вы имеете в виду, что для каждой комбинации дня и человека вы хотите вернуть его, если количество действительных часов, которые этот человек проработал в этот день, находится в пределах 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 голосов
/ 01 февраля 2010

Я думаю, вам все еще нужно уточнить немного, что вы ожидаете в результате. В то же время, вы могли бы начать?

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...