Суммируйте дату двух таблиц, сравнивайте их и возвращайте новый столбец на основе сравнения. - PullRequest
0 голосов
/ 08 ноября 2019

Ситуация: у меня есть пользователи, которые могут входить или выходить из системы. Эти значения регистрируются. Теперь я хочу показать, как часто пользователь вводит или выводит итоги за один день.

У меня есть таблица, в которой у меня есть два значения даты StampInDate и StampOutDate. Также есть employeeID. Я попытался подсчитать общее количество штампов и выходов за один день. Я уже могу показать мне общее количество марок для каждого штампа или штемпеля, но я не могу зайти так далеко, чтобы сравнить эти значения и создать новый столбец «totalStampsThatDay», который будет заполнен количеством марок в тот день. Я получаю сообщение об ошибке:

Сообщение 8120, Уровень 16, Состояние 1, Строка 17 Столбец 'dbo.timeRecording.employeeID' недопустим в списке выбора, поскольку он не содержится ни в агрегатефункция или предложение GROUP BY.

Код, который работает:

SELECT t.employeeID,
DATEPART(YEAR, t.inStampDate) AS 'InYear',                
DATEPART(MONTH, t.inStampDate) AS 'InMonth',              
DATEPART(DAY, t.inStampDate) AS 'InDay',
DATEPART(YEAR, t.outStampDate) AS 'OutYear',                  
DATEPART(MONTH, t.outStampDate) AS 'OutMonth',            
DATEPART(DAY, t.outStampDate) AS 'OutDay',
COUNT(t.inStampDate) AS 'StampIns',
COUNT( t.outStampDate) AS 'StampOuts'
FROM dbo.timeRecording t

GROUP BY  DATEPART(DAY, t.inStampDate),
          DATEPART(MONTH, t.inStampDate),
          DATEPART(YEAR, t.inStampDate),
          DATEPART(DAY, t.outStampDate),
          DATEPART(MONTH, t.outStampDate),
          DATEPART(YEAR, t.outStampDate),
          t.employeeID
ORDER BY t.employeeID

Теперь я пытаюсь отредактировать его, чтобы добиться того, чего я хочу, но не получилось:

SELECT tr.StampIns,
tr.StampOuts,
tr.eID,
t.employeeID,
DATEPART(YEAR, t.inStampDate) AS 'InYear',                
DATEPART(MONTH, t.inStampDate) AS 'InMonth',              
DATEPART(DAY, t.inStampDate) AS 'InDay',
DATEPART(YEAR, t.outStampDate) AS 'OutYear',                  
DATEPART(MONTH, t.outStampDate) AS 'OutMonth',            
DATEPART(DAY, t.outStampDate) AS 'OutDay'

FROM dbo.timeRecording t
JOIN
    (SELECT 
        COUNT(tr.inStampDate) AS 'StampIns',
        COUNT(tr.outStampDate) AS 'StampOuts',
        tr.employeeID as 'eID'
        FROM dbo.timeRecording tr
    ) tr ON tr.eID = t.employeeID

GROUP BY  DATEPART(DAY, t.inStampDate),
          DATEPART(MONTH, t.inStampDate),
          DATEPART(YEAR, t.inStampDate),
          DATEPART(DAY, t.outStampDate),
          DATEPART(MONTH, t.outStampDate),
          DATEPART(YEAR, t.outStampDate),
          t.employeeID,
          tr.eID,
          tr.StampIns,
          tr.StampOuts

ORDER BY t.employeeID

что-то вроде:

employeeID | date    | totalStampsThatDay
1          | 21.11.19| 2
2          | 21.11.19| 0
3          | 22.11.19| 1
1          | 22.11.19| 1

... и т. Д.

Ответы [ 2 ]

0 голосов
/ 08 ноября 2019
SELECT t.employeeID,
    DATEPART(YEAR, t.inStampDate) AS 'InYear',                
    DATEPART(MONTH, t.inStampDate) AS 'InMonth',              
    DATEPART(DAY, t.inStampDate) AS 'InDay',
    DATEPART(YEAR, t.outStampDate) AS 'OutYear',                  
    DATEPART(MONTH, t.outStampDate) AS 'OutMonth',            
    DATEPART(DAY, t.outStampDate) AS 'OutDay',
    COUNT(t.inStampDate)  + COUNT( t.outStampDate) as 'TotalStamps',
FROM dbo.timeRecording t

GROUP BY  DATEPART(DAY, t.inStampDate),
          DATEPART(MONTH, t.inStampDate),
          DATEPART(YEAR, t.inStampDate),
          DATEPART(DAY, t.outStampDate),
          DATEPART(MONTH, t.outStampDate),
          DATEPART(YEAR, t.outStampDate),
          t.employeeID
ORDER BY t.employeeID

Как насчет этого?

0 голосов
/ 08 ноября 2019

Запрос для получения результатов вашего последнего примера:

SELECT employeeID, stampdate, count(stampdate) as StampsCount       
    (SELECT employeeID, convert(date, inStampDate) as stampdate                   
    FROM dbo.timeRecording
    UNION
    SELECT employeeID, convert(date, outStampDate) as stampdate                      
    FROM dbo.timeRecording)
GROUP BY employeeID, stampdate
ORDER BY employeeID, stampdate
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...