我们正在尝试将出勤记录数据转换为数据透视表。为了简单起见,实际数据采用以下形式:
ls
我们需要这样:
EmployeeId, InOrOut, DateTime
1 0 2019-01-01 08:00:00
1 1 2019-01-01 17:00:00
1 0 2019-01-02 08:00:00
1 1 2019-01-02 17:00:00
2 0 2019-01-01 08:00:00
2 1 2019-01-01 17:00:00
但是,我们进行的查询似乎无法像这样工作。查询如下:
EmployeeId, Date, InTime , OutTime
1 2019-01-01 08:00 17:00
1 2019-01-02 08:00 17:00
2 2019-01-01 08:00 17:00
关于数据透视有很多困惑,个人找不到太多的教程。
我们如何告诉查询将数据放在新行的基础上(例如,在这种情况下,我们如何告诉查询根据日期和员工编号分隔记录)
任何帮助表示赞赏
答案 0 :(得分:4)
您可以进行聚合:
SELECT aml.EnrollNumber, aml.A_Date,
MAX(CASE WHEN aml.InOutMode = 1 THEN aml.A_Time END),
MAX(CASE WHEN aml.InOutMode = 0 THEN aml.A_Time END)
FROM dbo.Attendence_Machines_LOG AS aml
GROUP BY aml.EnrollNumber, aml.A_Date;
编辑:在问题编辑后:
SELECT aml.EnrollNumber, CAST(aml.A_Date AS DATE),
MAX(CASE WHEN aml.InOutMode = 1 THEN aml.A_Time END),
MAX(CASE WHEN aml.InOutMode = 0 THEN aml.A_Time END)
FROM dbo.Attendence_Machines_LOG AS aml
GROUP BY aml.EnrollNumber, CAST(aml.A_Date AS DATE);
答案 1 :(得分:1)
如果您希望这是关键,请尝试以下操作:
GO
create table #temptable ( empid int, inorout int, attdate datetime )
Go
insert into #temptable ( empid, inorout, attdate )
values ( 1 , 0 ,'2019-01-01 08:00:00'),
(1 ,1 ,'2019-01-01 17:00:00')
,(1 ,0 ,'2019-01-02 08:00:00')
,(1 ,1 ,'2019-01-02 17:00:00')
,(2 ,0 ,'2019-01-01 08:00:00')
,(2 ,1 ,'2019-01-01 17:00:00')
select * from #temptable
select empid, atdate, [0], [1] from (
select empid,inorout, CAST(attdate as DATE) as atdate, attdate from #temptable ) as d
pivot
( max(attdate) for inorout in ( [0], [1] )
) as pv
go
drop table #temptable
如果有任何疑问,请随时询问。
注意:但这仅在您每天只有1进1出作为给定原始数据的情况下有效。