2015-05-30 2 views
0

это таблица для журналов посещаемости:вычислить посещаемость и отметить отсутствующие на каждый день MS SQL

CREATE TABLE [dbo].[DeviceLogs] (
    [DeviceLogId] INT   NOT NULL, 
    [UserId]  NVARCHAR (50) NOT NULL, 
    [LogDate]  DATETIME  NOT NULL, 
); 

это мой сотрудник стол:

CREATE TABLE [dbo].[Employees] (
    [EmployeeId]    INT   IDENTITY (1, 1) NOT NULL, 
    [EmployeeName]   NVARCHAR (50) NULL, 
    [UserId]   NVARCHAR (50) NOT NULL, 
    [Gender]     NVARCHAR (255) NULL, 
    [DepartmentId]   NVARCHAR (255) NULL, 
    [Designation]   NVARCHAR (255) NULL, 
    [CategoryId]    INT   NULL, 
    [DOJ]     DATETIME  NULL, 
    [DOR]     DATETIME  NULL, 
    [Status]     NVARCHAR (255) NULL, 
    [DOB]     DATETIME  NULL, 
); 

Мы внесем журналы посещаемости в первой таблице ,

Теперь я хочу рассчитать посещаемость каждого сотрудника в каждый день.

SELECT [userid]           AS identit, 
     CONVERT(VARCHAR, userid), 
     Min(logdate)          AS lowtime, 
     Max(logdate)          AS hightime, 
     CONVERT(VARCHAR, Max(logdate) - Min(logdate), 108) AS dur, 
     CASE 
     WHEN CONVERT(VARCHAR, Max(logdate) - Min(logdate), 108) IS NOT NULL 
     THEN 
     'present' 
     ELSE 'Absent' 
     END            AS Status 
FROM [dbo].[devicelogs] 
GROUP BY [userid] 
ORDER BY userid DESC 

Это запрос MS SQl, который я использую. Но это дает мне результат только в том случае, если у человека есть журналы посещаемости.

Я хочу рассчитать посещаемость, даже если человек отсутствует. Я хочу, чтобы он повторял его каждый день.

Пожалуйста, помогите мне здесь.

+0

Вы помечено C#, которые вы пытались вычисления в C#? Если да, приложите свой [код C#] (http://stackoverflow.com/help/how-to-ask). – lloyd

ответ

1

Если не так, должна быть таблица User, которая содержит список всех пользователей.

Вы должны Left/Right outer joinUser стол с devicelogs стол.

Нечто подобное.

SELECT U.[userid]           AS identit, 
     CONVERT(VARCHAR, U.userid), 
     Min(logdate)          AS lowtime, 
     Max(logdate)          AS hightime, 
     CONVERT(VARCHAR, Max(logdate) - Min(logdate), 108) AS dur, 
     CASE 
     WHEN d.userid IS NOT NULL THEN 'present' 
     ELSE 'Absent' 
     END            AS Status 
FROM [users] U -- Replace with the table that contains all the users 
     LEFT OUTER JOIN [dbo].[devicelogs] D 
        ON U.userid = D.userid 
GROUP BY [userid] 
ORDER BY U.userid DESC 
0

Чтобы получать ежедневные отчеты/списки обычно лучше иметь таблицу даты, которая содержит все возможные даты вы когда-нибудь понадобится, например, 1.1.2000 - 31.12.2099. С его помощью вы можете легко создать запрос группа по этой дате, как это:

SELECT 
    e.userid, 
    d.[date], 
    l.first, 
    l.last, 
    case when l.first is null then 'Absent' else 'Present' end as status 
FROM 
    [dbo].[Employees] e 
    cross join [dbo].[Dates] d 
    outer apply (
     select min(logdate) as first, max(logdate) as last 
     from [dbo].[devicelogs] l 
     where l.userid = e.userid and 
     l.logdate >= d.[date] and l.logdate < dateadd(day, 1, d.[date] 
    ) l 
where d.[date] >= '20150501' and d.[date] < getdate() 
GROUP BY e.userid, d.[date] 
ORDER BY e.userid desc, d.[date] desc 

Вы можете сделать это, конечно, с devicelog тоже, но если есть когда-либо единая дата без каких-либо журналов вы пропустите что полностью ,

Не пробуйте это, надеюсь, что нет никаких ошибок :)

0

Прежде всего необходимо выяснить, почему таблица регистрации может иметь несколько пользователей без даты журнала, так как logdate установлен в NOT NULL и вы quering журнальной таблицы и ожидая получить некоторых пользователей без logdate.

Алгоритм: Когда сотрудник не находится в таблице журналов, установите его как отсутствующий и установите продолжительность равной 0. Другие, подсчитывают продолжительность и устанавливают его как присутствующего. Плюс получить его дату открытия журнала и последнюю дату журнала.

1) Получить таблицу, показывающую пользователей с нулевыми датами

select E.UserID as UserID,L.LogDate as logdate from employee E 
full outer join 
DeviceLogs L 
on E.UserID=L.UserID  

2) применяют код к этой таблице