Вы можете использовать apply
, чтобы развернуть данные, а затем выполнить агрегирование:
select t.user_id, sum(is_create), sum(is_complete)
from t cross apply
(values (t.c_time, 1, 0), (t.done_time, 0, 1)
) v(t, is_create, is_complete)
where v.t >= '2020-01-01' and v.t < '2020-02-01'
group by t.user_id;
Вы также можете сделать это с помощью условного агрегирования:
select user_id,
sum(case when c_time >= '2020-01-01' and c_time < '2020-02-01' then 1 else 0 end),
sum(case when done_time >= '2020-01-01' and done_time < '2020-02-01' then 1 else 0 end)
from t
group by user_id;
Это, вероятно, немного быстрее для вашего конкретного примера. Однако первая версия более универсальна - например, она позволяет легко подводить итоги как по пользователям, так и по месяцам.