首页 > 解决方案 > 基于sql中另一列的列中的不同计数

问题描述

我有一个包含两列的员工表:emp_id 和month_of_project。我想找出特定月份参与项目的员工人数。这意味着如果同一个人在 3 个月内参与,我们将只计算第一个月的那个人。我在下面提到了示例

emp_id       month_of_project
101           Jan
102           Jan
103           Jan
101           Feb
104           Mar
102           Mar
105           Apr
103           Apr

结果应该是

month    count
Jan     3
Feb     0
Mar     1
Apr     1  

有没有办法在sql中实现这一点?

标签: sql

解决方案


sql用于oracle。并且请不要在您的真实系统中存储这样的月份。使用日期字段。如果您的用例只是月份,那么年份可以是任意的,例如 2000,而日期可以是 01,但用于排序等的 atleaset 始终始终是正确的想法。

首先只是模拟数据。mons 部分中的第二个是获取可能月份的列表,因为您希望 2 月为 0。如果您在外面有该表,则不需要它。

然后基本上内部查询找到员工的第一个月作为要使用的月份,外部查询计数不同

with emp_mon as 
(
              select '101' emp_id, to_date('20190101','YYYYMMDD') month_of_project from dual 
    union all select '102', to_date('20190101','YYYYMMDD') from dual 
    union all select '103', to_date('20190101','YYYYMMDD') from dual 
    union all select '101', to_date('20190201','YYYYMMDD') from dual 
    union all select '104', to_date('20190301','YYYYMMDD') from dual 
    union all select '102', to_date('20190301','YYYYMMDD') from dual 
    union all select '105', to_date('20190401','YYYYMMDD') from dual 
    union all select '103', to_date('20190401','YYYYMMDD') from dual 
),
mons as
(
    select distinct month_of_project
    from  emp_mon
)
select mons.month_of_project, count(distinct emp_first_mon.emp_id) cnt_emp_id
from mons
     left outer join
     (
         select emp_id, min(month_of_project) month_of_project
         from emp_mon
         group by emp_id
     ) emp_first_mon on emp_first_mon.month_of_project = mons.month_of_project
group by mons.month_of_project
order by 1


推荐阅读