SQL-запрос TA BioStar - PullRequest
       2

SQL-запрос TA BioStar

0 голосов
/ 24 февраля 2019

У меня есть Запрос, чтобы показать значения TA, и результат будет показан как показано ниже

SELECT convert(varchar(10),DATEADD(second, dbo.TB_EVENT_LOG.nDateTime, '19700101 00:00:00'),103) as [date] ,left(convert(varchar(10),DATEADD(second, dbo.TB_EVENT_LOG.nDateTime, '19700101 00:00:00'),108),5) as [time],
CASE WHEN dbo.TB_EVENT_LOG.[nReaderIdn] in(539577044) THEN 'F1' WHEN dbo.TB_EVENT_LOG.[nReaderIdn] in(539577051) THEN 'F2' END AS FunctionKey,TB_USER_CUSTOMINFO.sFieldValue8 as EMPLOYEEID
FROM dbo.TB_EVENT_LOG INNER JOIN dbo.TB_USER ON dbo.TB_EVENT_LOG.nUserID = dbo.TB_USER.sUserID INNER JOIN dbo.TB_USER_CUSTOMINFO ON dbo.TB_USER.nUserIdn = dbo.TB_USER_CUSTOMINFO.nUserIdn
where nDateTime > datediff(second, '19700101 00:00:00', DATEADD(DAY, -4, getdate())) and nDateTime < datediff(second, '19700101 00:00:00', getdate())


╔════════════╤═══════╤═════════════╤════════════╗
║ date       │ time  │ FunctionKey │ EMPLOYEEID ║
╠════════════╪═══════╪═════════════╪════════════╣
║ 21/02/2019 │ 08:37 AM │ F1          │ 19564      ║
╟────────────┼───────┼─────────────┼────────────╢
║ 21/02/2019 │ 04:39 PM │ F2          │ 19564      ║
╟────────────┼───────┼─────────────┼────────────╢
║ 21/02/2019 │ 04:56 PM │ F1          │ 19564      ║
╟────────────┼───────┼─────────────┼────────────╢
║ 21/02/2019 │ 05:49 PM│ F2          │ 19564      ║
╟────────────┼───────┼─────────────┼────────────╢
║ 21/02/2019 │ 05:53 PM │ F1          │ 19564      ║
╟────────────┼───────┼─────────────┼────────────╢
║ 21/02/2019 │ 06:06 PM│ F2          │ 19564      ║
╟────────────┼───────┼─────────────┼────────────╢
║ 21/02/2019 │ 01:26 PM│ F1          │ 19564      ║
╟────────────┼───────┼─────────────┼────────────╢
║ 21/02/2019 │ 01:32 PM│F1          │ 19564      ║
╟────────────┼───────┼─────────────┼────────────╢
║ 21/02/2019 │ 01:33 PM│ F2          │ 19564      ║
╟────────────┼───────┼─────────────┼────────────╢
║ 21/02/2019 │ 01:45 PM│ F1          │ 19564      ║
╟────────────┼───────┼─────────────┼────────────╢
║ 21/02/2019 │ 03:00 PM│ F2          │ 19564      ║
╟────────────┼───────┼─────────────┼────────────╢
║ 21/02/2019 │ 04:38 PM│ F1          │ 19564      ║
╚════════════╧═══════╧═════════════╧════════════╝

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

если кто-то может помочь мне, чтобы показать только минимальное значение F1 и максимальное значение F2 за дату, идентификатор сотрудника

╔════════════╤═══════╤═════════════╤════════════╗
║ date       │ time  │ FunctionKey │ EMPLOYEEID ║
╠════════════╪═══════╪═════════════╪════════════╣
║ 21/02/2019 │ 08:37 AM│ F1          │ 19564      ║
╟────────────┼───────┼─────────────┼────────────╢
║ 21/02/2019 │ 06:06 PM│ F2          │ 19564      ║
╚════════════╧═══════╧═════════════╧════════════╝

Ответы [ 3 ]

0 голосов
/ 25 февраля 2019

Вы должны использовать UNION здесь, чтобы получить оба результата, и при расчете MIN и MAX он должен быть в исходном столбце даты / времени, а не в преобразованной строке

Что-то вроде этого, но значительно упрощенное

SELECT CONVERT(...dbo.TB_EVENT_LOG.nDateTime...) AS [date], 
       CONVERT(..., MIN(dbo.TB_EVENT_LOG.nDateTime), ...) AS [Time], empId, 'F1'
WHERE funcKey = 'F1'
GROUP BY CONVERT(...dbo.TB_EVENT_LOG.nDateTime...), empId
UNION ALL
SELECT CONVERT(...dbo.TB_EVENT_LOG.nDateTime...) AS [date], 
       CONVERT(..., MAX(dbo.TB_EVENT_LOG.nDateTime), ...) AS [Time], empId, 'F2'
WHERE funcKey = 'F2'
GROUP BY CONVERT(...dbo.TB_EVENT_LOG.nDateTime...), empId
0 голосов
/ 05 апреля 2019

Вы можете получить ожидаемый результат после группировки по дате.право?

Попробуй.

SELECT [date],left(convert(varchar(10),DATEADD(second, utc, '19700101 00:00:00'),108),5) as [time], FunctionKey,TB_USER_CUSTOMINFO.sFieldValue8 as  EMPLOYEEID
  FROM (
        SELECT MMDDYYYY AS [date], nUserID, MIN(nDateTime) as utc , 'F1' AS FunctionKey
          FROM (

                SELECT convert(varchar(10),DATEADD(second, dbo.TB_EVENT_LOG.nDateTime, '19700101 00:00:00'),103) AS MMDDYYYY
                       , nUserID
                       , nDateTime
                  FROM dbo.TB_EVENT_LOG
                 WHERE nDateTime > datediff(second, '19700101 00:00:00', DATEADD(DAY, -4, getdate())) 
                       and nDateTime < datediff(second, '19700101 00:00:00', getdate())
                       and dbo.TB_EVENT_LOG.[nReaderIdn] in(539577044) ) DATE_ADDED
         GROUP BY MMDDYYYY, nUserID
         UNION ALL
        SELECT MMDDYYYY AS [date], nUserID, MAX(nDateTime) as utc , 'F2' AS FunctionKey
          FROM (
                SELECT convert(varchar(10),DATEADD(second, dbo.TB_EVENT_LOG.nDateTime, '19700101 00:00:00'),103) AS MMDDYYYY
                       , nUserID
                       , nDateTime
                  FROM dbo.TB_EVENT_LOG
                 WHERE nDateTime > datediff(second, '19700101 00:00:00', DATEADD(DAY, -4, getdate())) 
                       and nDateTime < datediff(second, '19700101 00:00:00', getdate())
                       and dbo.TB_EVENT_LOG.[nReaderIdn] in(539577051) ) DATE_ADDED
         GROUP BY MMDDYYYY, nUserID  ) TA_DATA
       INNER JOIN dbo.TB_USER ON TA_DATA.nUserID = dbo.TB_USER.sUserID 
       INNER JOIN dbo.TB_USER_CUSTOMINFO ON dbo.TB_USER.nUserIdn = dbo.TB_USER_CUSTOMINFO.nUserIdn

0 голосов
/ 25 февраля 2019

, чтобы показать результат в том же столбце, я внес некоторые изменения,

SELECT EmployeeID,date,FunctionKey,
CASE when FunctionKey='F1' then min(time) else max(time) end as Final_Time
FROM [TA] group by date,EmployeeID,FunctionKey;

Здесь результат будет показывать минимальное значение времени для F1 и максимальное значение времени для F2 для EmployeeID, дату натот же столбец, опять же, я не уверен, какой тип времени вы используете, возможно, вы можете преобразовать текущий формат в 24-часовой формат и затем отсортировать его.

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