【问题标题】:How can I find the total amount of employees in each gender, that are currently working in each year?我如何才能找到每年目前在职的每种性别的员工总数?
【发布时间】:2021-04-26 05:59:44
【问题描述】:

员工表

dept_emp 表

SELECT
    COUNT(de.emp_no) AS num_of_employees,
    e.gender AS gender, 
    YEAR(de.from_date) AS year
FROM employees e
JOIN dept_emp de
    USING (emp_no)
GROUP BY gender, year
ORDER BY year

使用这段代码,我可以得到以下查询结果

失败的结果

我在这里解决的问题是能够按性别排序每年雇用的员工人数。

我要解决的问题是: 有多少男性和女性在整个公司工作过,显示该年每年活跃员工的总数。

但是,问题是我无法获得每年当前在职的在职员工和性别,因为我使用的是 from_date 列,因此没有考虑离职/失业的人来自 dept_emp 表中的 to_date 列。

我昨天和今天花了 10 个小时试图弄清楚这一点。我使用的其他一些代码在这里,但没有运气。把这个放在这里,以防我错过了什么等等。

SET @total := 0;
SELECT 
    gender,
    year,
    hired_employees,
@total := @total + hired_employees AS currently_employed
FROM
(SELECT 
    COUNT(de.emp_no) AS hired_employees,
    e.gender AS gender,
    YEAR(de.from_date) AS year
FROM dept_emp de
JOIN employees e
    USING (emp_no)
WHERE gender = "M" 
GROUP BY gender, year
ORDER BY gender, year) AS male_employees

failed running total

我在这里得到了总和,在这种情况下是所有男性员工,但不能在 where 子句中添加 AND 性别 = "F",因为总和不是与每个性别分开的。在此代码中每年也无法区分活跃和不活跃的员工。

非常感谢任何帮助。

【问题讨论】:

  • 您使用的是 MySQL 8.x 吗?然后您可以使用窗口函数来获取每个分区中的运行总计。
  • 使用最新版本,over 子句没有运气。

标签: mysql


【解决方案1】:

我认为可能会有所帮助的方法是制作一个日历表,然后加入它以进行分组。假设您有一个日历表,我认为这样的查询会为您提供所需的内容

SELECT cal.y AS `year`
  , SUM(IF(e.gender = 'M', 1, 0)) AS male_count
  , SUM(IF(e.gender = 'F', 1, 0)) AS female_count
FROM reference.calendar cal
LEFT JOIN dept_emp de ON (cal.y > YEAR(de.from_date) AND cal.y < YEAR(de.to_date))
LEFT JOIN employees e ON e.emp_no = dept_emp.emp_no
WHERE cal.y BETWEEN [your desired range]
GROUP BY cal.y

Here 是一些创建健壮日历表的好说明。

【讨论】:

  • 查看了它,但仍然没有运气。尽管使用相同的数据库,但似乎没有人在网上遇到类似的问题。人们似乎使用“每年雇用多少人”而不是“目前每年雇用多少人”这个问题,这很有趣.. 使用带有循环增量的 python 可能更好?
  • @HubbsBuns 这里是一个链接,其中包含有关如何创建一个好的日历表的说明。 brianshowalter.com/calendar_tables我已经编辑了我的答案以包含这个链接。当您说“调查过但仍然没有运气”时,您是什么意思?您应该会发现我提供的答案确实回答了“目前每年雇用多少人”的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多