Вы сказали: "все, что мне действительно нужно, это знать, есть ли для этого дня одно касание."
Ответ - совокупный запрос
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, но мне нравится кодировать, я покажу вам рабочий код как это можно сделать программно.Ниже приведено несколько фрагментов кода, которые могут быть объединены в один
-- 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 - если вы посмотрите на результат, а теперь возвращаясь к проблеме, о которой я упоминал ранее, вы можете присоединить эту таблицу к полному списку сотрудников и получить полный набор данных, включая сотрудников, которые не совершали пролистывание в течение выбранного периода.