Ситуация: у меня есть пользователи, которые могут входить или выходить из системы. Эти значения регистрируются. Теперь я хочу показать, как часто пользователь вводит или выводит итоги за один день.
У меня есть таблица, в которой у меня есть два значения даты 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
... и т. Д.