2014-09-18 2 views
4

У меня есть таблица базы данных, как это:
enter image description here
Я надеюсь, что я могу объяснить это хорошо, так что вы можете понять.Sql запрос для создания вычисляемого поля

Я хочу рассчитать, сколько часов каждый сотрудник работал.
Например, для «Arjeta Domi» у нас есть Cell (2,3) - Cell (3,3) + Cell (4,3) + Cell (5,3), что делает разницу между каждым временем logOut со временем входа в систему.

enter image description here

Финальный стол, который я хочу, будет иметь следующие столбцы: CardNo, UserName, Date, PauseTime, WorkTime

Я попробовал этот запрос: взят из duplicate

SELECT DISTINCT 
    [Card NO], 
    [User Name], 
    (
    SELECT 
     MIN(DateTime) AS [Enter Time], 
     MAX(DateTime) AS [Exit Time], 
     MAX(DateTime) - MIN(DateTime) AS [Inside Hours] 
    FROM 
     ExcelData 
) 
FROM 
    ExcelData 
GROUP BY 
    [Card NO], [User Name], DateTime 

DateTime Колонна имеет тип String, а не DateTime. Я работаю с MS Access Database.

ответ

1

Выбрать все строки с «m001-1-In» с DateTime, как я и добавить подходящие «m001-1-выход» строки к этому с подзапрос как О, это будет выглядеть следующим образом:

SELECT t1.[Card No], t1.[User Name],dateTime as I 
,(Select TOP 1 dateTime from Tab t2 where t2.[Card No]= t1.[Card No] 
and t2.[User Name]= t1.[User Name] and t2.Addr='m001-1-Exit' 
and t2.DateTime>t1.datetime ORDER by DateTime) as O 
FROM Tab t1 
where t1.Addr='m001-1-In' 

enter image description here

Теперь это легко инкапсулировать это, показать, как Получали ниже и добавьте наш SUM и группирование к этому:

SELECT [Prepared].[Card No], [Prepared].[User Name], SUM(DateDiff('n',I,O))/60 AS Hours 
FROM (
     SELECT t1.[Card No], t1.[User Name],dateTime as I 
    ,(Select TOP 1 dateTime from Tab t2 where t2.[Card No]= t1.[Card No] 
     and t2.[User Name]= t1.[User Name] and t2.Addr='m001-1-Exit' 
     and t2.DateTime>t1.datetime ORDER by DateTime) as O 
FROM Tab t1 
where t1.Addr='m001-1-In' 
) AS [Prepared] 
GROUP BY [Prepared].[Card No], [Prepared].[User Name] 

Если вам необходимо ограничить DateRange добавить необходимые условия для ряда where t1.Addr='m001-1-In'

+0

Он отлично работает. Спасибо за помощь. – eviB

+0

С удовольствием :-) – bummi

+0

Привет, я хотел спросить вас, можно ли использовать этот запрос для вставки. ex: INSERT INTO fTable (f1, f2, f3) SELECT g1, h2, g3 FROM «yourQuery» Inner Join hTable в [здесь поля]? Было бы очень полезно, спасибо! – eviB

-1

Попробуйте это:

SELECT CardNo, UserName, SUM(DATEDIFF('h',DateTime,(SELECT MIN(Datetime) 
                FROM table as t2 
                WHERE t1.CardNo=t2.CardNo 
                 AND t2.Addr like '%Exit' 
                 AND t2.DateTime > t1.DateTime))) 
FROM table as t1 
WHERE Addr like '%In' 
GROUP BY CardNo, UserName 
+0

Я попробовал этот запрос, но не показывает никакого результата ... – eviB

Смежные вопросы