已解决:
有一个尚未完善的解决方案,但可以在前端进行进一步处理以显示它!我基本上有2个选择,可以从一个中创建两个表,然后通过内部联接将它们连接在一起,在同一行中,我在一天内将同一用户的所有戳记和戳记都取消了。
SELECT * FROM
(SELECT SUM(CASE WHEN DATEPART(YEAR, t.inStampDate) > 2018 THEN 1 ELSE 0 END) AS 'Stamps',
ISNULL(t.inStampDate, '') as 'inStampDate',
t.employeeID
FROM dbo.timeRecording t
WHERE DATEPART(YEAR, t.inStampDate) > 2018
GROUP BY t.employeeID,
t.inStampDate ) inStamp
INNER JOIN
(SELECT SUM(CASE WHEN DATEPART(YEAR, t.outStampDate) > 2018 THEN 1 ELSE 0 END) AS 'Stamps',
ISNULL(t.outStampDate, '') as 'outStampDate',
t.employeeID
FROM dbo.timeRecording t
WHERE DATEPART(YEAR, t.outStampDate) > 2018
GROUP BY t.employeeID,
t.outStampDate ) outStamp
ON inStamp.inStampDate = outStamp.outStampDate AND inStamp.employeeID = outStamp.employeeID
以前的情况:
情况:我有可以登录或加盖和退出的用户。这些值正在被记录。现在,我要显示用户在一天内总共踩踏或踩踏的频率。
我有一个表,其中有两个日期值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
...等等
----更新---- 几乎得到了我想要的东西。我只需要为日期添加一栏,例如2019-11-19,但我现在无法这样做。
SELECT t.employeeID,
COUNT(t.inStampDate) + COUNT( t.outStampDate) as 'TotalStamps',
SUM(CASE WHEN DATEPART(YEAR, t.inStampDate) > 2018 THEN 1 ELSE 0 END) AS 'StampIns',
SUM(CASE WHEN DATEPART(YEAR, t.outStampDate) > 2018 THEN 1 ELSE 0 END) AS 'StampOuts'
FROM dbo.timeRecording t
WHERE DATEPART(YEAR, t.inStampDate) > 2018 OR DATEPART(YEAR, t.outStampDate) > 2018
GROUP BY t.employeeID
到目前为止,我的输出是
employeeID | Total | In | Out
7 | 9 | 6 | 3
8 | 105 | 48 | 57
11 | 6 | 5 | 1
想要:
employeeID | Date | Total | In | Out
7 | 2019-11-19 | 2 | 1 | 1
7 | 2019-11-20 | 3 | 2 | 1
11 | 2019-11-19 | 1 | 1 | 0
11 | 2019-11-16 | 2 | 1 | 1
答案 0 :(得分:0)
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
那呢?