首页 > 解决方案 > 如何在SQL中获取同月2个日期字段的计数数据

问题描述

我正在尝试创建一个有 3 列的查询。

  1. C_Time:包含任务创建日期时间
  2. Done_Time:包含任务完成日期时间
  3. 用户 ID:用户的唯一 ID

我想获得结果,我想获得特定月份创建的任务总数和按用户 ID 分组的同一个月完成的任务总数

输出将如下所示:

UserID    |  CreatedCount   |  DoneCount
------------------------------------------
U12        |    12          |   12
-------------------------------------------
U13       |     7           |    5

这里 U12 用户在 2020 年 1 月创建了 12 个任务并完成了 12 个任务。但用户 U13 在 2020 年 1 月创建了 7 个任务,当月完成了 5 个任务。

标签: sqlsql-server

解决方案


您可以使用applyunpivot 数据然后聚合:

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;

对于您的特定示例,这可能会快一点。但是,第一个版本更通用——例如,它允许您轻松地按用户和月份进行汇总。


推荐阅读