sql - 基于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用于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
推荐阅读
- android - 自 API 28 以来是否再次需要 android.permission.INTERNET?
- javascript - 未使用 ajax 调用发送标头
- c++ - 如何将数据发送到另一个进程(仅限 c++ 语言级别)
- batch-file - 计划的批处理文件错误(0xff) - 正常执行它工作正常
- java - 堆栈是从 0 开始还是从 1 开始?
- rust - 如何通过 Rust 宏将表达式中的一个标识符替换为另一个标识符?
- model-checking - UPPAAL SMC 避免状态空间爆炸
- java - 如何从 Zip 文件中提取 Json 数据并将提取的 Json 文件发送到前端?
- swift - 如何制作自定义 NSDatePickerCell 以更改选择颜色?
- html - 为什么 django 不使用拖放文件上传重定向到新的 url?