你说:“我真正需要的是知道那天是否有单次滑动。”
答案 - 聚合查询
select employeeid, TranDate, count(TranDate) as count
from History
where -- look below
Group by employeeid, TranDate
在WHERE 中输入什么? - 依靠。如果你想要月份,那就做
TranDate between '2018-10-1' and '2018-10-31 23:59:59.999'
如果您想要特定日期,请执行
CAST(trandate as DATE) in ('2018-10-1', '2018-10-11', '2018-10-11')
在后一种情况下,您必须动态构建它
但在这种情况下,您将面临一个新问题 - 如果您的人从未进过门怎么办?此人不会出现在列表中。然后你需要letf join这个有一个包含所有员工的表
现在因为我不是 TSql 超级大师,但我喜欢编码,我向您展示工作代码如何以编程方式完成。下面是几个可以组合成一个的sn-ps代码
-- SETUP
create table recs (id int, dt date );
insert into recs values(1, '2018-10-1');
insert into recs values(1, '2018-10-1');
insert into recs values(2, '2018-10-2');
insert into recs values(2, '2018-10-2');
insert into recs values(2, '2018-10-3');
insert into recs values(3, '2018-10-3');
insert into recs values(3, '2018-10-3');
insert into recs values(3, '2018-10-4');
insert into recs values(3, '2018-10-1');
-- Prepare Date Grid table
DECLARE crs_dt CURSOR FOR SELECT dt FROM recs group by dt order by dt;
declare @createTbl varchar(1200) = 'create table tbl (id int, ';
declare @fetched varchar(20);
OPEN crs_dt;
FETCH NEXT FROM crs_dt into @fetched;
WHILE @@FETCH_STATUS = 0
BEGIN
set @createTbl = @createTbl + '['+@fetched+'] int'
FETCH NEXT FROM crs_dt into @fetched;
if @@FETCH_STATUS = 0
begin set @createTbl = @createTbl + ','; end
END
set @createTbl = @createTbl + ')';
CLOSE crs_dt;
DEALLOCATE crs_dt;
select @createTbl; -- just a test
execute (@createTbl)
SELECT * FROM tbl; -- just a test
-- LOAD date grid table with data
DECLARE crs_rec CURSOR FOR
SELECT id, dt, FORMAT ( dt, 'yyyy-MM-dd' ) colName,
(case count(dt) when 0 then 0 else 1 end) cnt
FROM recs group by id, dt order by dt;
declare @createInsert varchar(1200);
declare @id int, @dt date, @colName varchar(20),@yesNo int;
OPEN crs_rec;
FETCH NEXT FROM crs_rec into @id, @dt, @colName, @yesNo;
WHILE @@FETCH_STATUS = 0
BEGIN
if exists(select 1 from tbl where id = @id)
set @createInsert = 'update tbl set ['+@colName+']='+cast(@yesNo as varchar(1))+ ' where id='+ cast(@id as varchar(1000));
else
set @createInsert =
'insert into tbl (id,['+@colName+']) values ('+cast(@id as varchar(1000))+','+cast(@yesNo as varchar(1))+')';
select @createInsert; -- just a test
execute (@createInsert);
FETCH NEXT FROM crs_rec into @id, @dt, @colName, @yesNo;
END
CLOSE crs_rec;
DEALLOCATE crs_rec;
commit;
-- Lets Load data
SELECT * FROM tbl
结果是……
不是最快或最高效的代码,但肯定很有趣。而且,1-这是完全动态的。 2-如果你看结果,现在回到我之前提到的问题,你可以将此表加入到完整的员工列表中,并获取整组数据,包括在所选时间段内没有刷卡的员工。