Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何统计每个月的现有员工人数?_Php_Sql_Postgresql_Postgis_Postgresql 9.2 - Fatal编程技术网

Php 如何统计每个月的现有员工人数?

Php 如何统计每个月的现有员工人数?,php,sql,postgresql,postgis,postgresql-9.2,Php,Sql,Postgresql,Postgis,Postgresql 9.2,我正在寻找SQL来统计在特定年份每个月工作的员工数量。表示质量保证部门在2013年的结果如下: dept_name Jan Feb Mar Apr May Jun Jul Aug Sept Oct Nov Dec QA ( **count of working employees in each month** ) 表1员工: id dept_id emp_name date_started date_

我正在寻找SQL来统计在特定年份每个月工作的员工数量。表示质量保证部门在2013年的结果如下:

dept_name   Jan   Feb   Mar   Apr   May   Jun   Jul   Aug   Sept   Oct   Nov   Dec
QA          ( **count of working employees in each month** )
表1员工:

id    dept_id    emp_name    date_started     date_terminated
1     3          Amstrong    01-Apr-13        null
2     4          Blowing     03-Jun-13        null
3     3          Jerry       09-Sept-13       01-May-14
4     3          Smack       04-Jun-12        null
5     4          Zuckus      13-Aug-12        13-Dec-13
6     4          Kolman      19-Nov-12        null
7     3          Qual        15-Oct-12        02-Nov-13
8     4          John        11-Jul-11        06-Apr-13
9     4          Delta       28-Jan-14        null
10    3          Panther     17-Jul-14        null
11    3          Amay        01-Apr-13        null
12    4          Blue        03-Jun-13        null
13    3          Jack        09-Sept-13       01-May-14
14    3          Stack       04-Jun-12        null
15    4          Jasus       13-Aug-12        13-Dec-13
表部门:

id      dept_name
1       IT
2       Support
3       QA
4       Development
5       Admin
我尝试获取结果的查询:

SELECT
    d.dept_name,
    COUNT (CASE WHEN EXTRACT(MONTH FROM e.date_started) = 1 THEN e.id END) as "Jan",
    COUNT (CASE WHEN EXTRACT(MONTH FROM e.date_started) = 2 THEN e.id END) as "Feb",
    COUNT (CASE WHEN EXTRACT(MONTH FROM e.date_started) = 3 THEN e.id END) as "Mar",
    COUNT (CASE WHEN EXTRACT(MONTH FROM e.date_started) = 4 THEN e.id END) as "Apr",
    COUNT (CASE WHEN EXTRACT(MONTH FROM e.date_started) = 5 THEN e.id END) as "May",
    COUNT (CASE WHEN EXTRACT(MONTH FROM e.date_started) = 6 THEN e.id END) as "Jun",
    COUNT (CASE WHEN EXTRACT(MONTH FROM e.date_started) = 7 THEN e.id END) as "Jul",
    COUNT (CASE WHEN EXTRACT(MONTH FROM e.date_started) = 8 THEN e.id END) as "Aug",
    COUNT (CASE WHEN EXTRACT(MONTH FROM e.date_started) = 8 THEN e.id END) as "Sep",
    COUNT (CASE WHEN EXTRACT(MONTH FROM e.date_started) = 10 THEN e.id END) as "Oct",
    COUNT (CASE WHEN EXTRACT(MONTH FROM e.date_started) = 11 THEN e.id END) as "Nov",
    COUNT (CASE WHEN EXTRACT(MONTH FROM e.date_started) = 12 THEN e.id END) as "Dec"
FROM department d
    JOIN employee e ON (d.id = e.dept_id)
WHERE EXTRACT(month FROM e.date_started) BETWEEN 01 AND 12
    AND EXTRACT(year FROM e.date_started) < 2014
    AND (e.date_terminated IS NULL OR EXTRACT(month FROM e.date_terminated) > EXTRACT(month FROM NOW())) 
    AND (e.date_terminated IS NULL OR EXTRACT(year FROM e.date_terminated) >= EXTRACT(year FROM NOW()))
GROUP BY d.name
ORDER BY d.name ASC 

<>但是只考虑在那个月开始工作的雇员

你应该在表格里有一个列,就像一个日志,然后你可以真正检查谁在一个月内工作,目前无法检查谁在哪个月工作,您只能检查有多少员工在某个月开始工作,或者有多少员工在某个月结束工作

但这就是查询应该仅在以下位置显示的方式:您必须添加一个新的员工列,该列存储当前员工的工作日志

SELECT

COUNT(employee.id) as 'Number of EMployees',
department.dept_name as 'Department name'

FROM employee

LEFT JOIN department on employee.dept_id=department.id

WHERE 

employee.dateLog > 2013-01-01
employee.dateLog < 2013-02-01

您可以在每个月生成一个日期,并查找在该日期工作的员工人数。格式为每个部门每月一行。在单独的操作中旋转结果,最好在应用程序层完成:

with months as (
      select generate_series('2013-01-01'::timestamp, '2013-12-01'::timestamp, '1 month') as m
     ),
select d.dept_name, m.m, count(e.dept_id) as numemployees
from department d cross join
     months m left join
     employee e
     on e.dept_id = d.id and e.date_started <= m.m and
        (e.date_terminated is null or e.date_terminated >= m.m)
group by d.dept_name, m.m
order by d.dept_name, m.m;

这是另一种方法,该代码将提供2013年每个部门的1月和2月员工计数。这里是sql fiddle


您将需要执行一个存储过程来执行如此精确的操作。到目前为止,您尝试了什么?堆栈溢出不是代码编写服务。我没有否决投票,因为您提供了数据和预期结果。。。但是,是的,你最好自己尝试解决这个问题,并解释你在哪里被卡住了。你能修复你的标签吗?我发现这两个方面都与Oracle有关。@Siyual我已经更新了我的问题。通过查看起始和终止范围,仍然可以计算出给定月份的员工人数……其实不是……您所需要的只是添加日志列……甚至一个单独的表。因为如果您试图根据当前表中的信息计算用户数量,它不会告诉您本月有多少员工工作,而是告诉您有多少员工开始或完成了工作……请查看此处并在employee.dateLog>2013-01-01 employee.dateLog<2013-02的位置执行您的代码-01@boomoto这永远不会发生给你一个月内工作人数的真实数字,只有多少人开始/完成了工作…….如果埃博利病毒广泛传播,而大多数员工不来上班,你的结果数字将是错误的……我知道这是极端的,但最好学习结构化数据库,以适应任何情况,因此数字值是wright@ZiomekZiomski,他可能只有只读权限,是的,它的设计很糟糕,但这不是问题所在。我的工作方式是,他想要的是某个月雇佣的员工数量,而不是工作的数量。如果你生病了,你仍然在工作。你的代码正在工作,但我需要所有部门列表也在那里,要么为空,要么为空zero@codeBYmahesh好的,我更新了答案,以反映所有部门和一个零:谢谢,它的工作,但没有优化,甚至我接受这个答案
 SELECT a.dept_name, coalesce(Jan.total,0) as Jan, coalesce(Feb.total,0) as Feb
FROM department as a
LEFT JOIN 
(SELECT dept_id, COUNT(emp_name) as total from employee
where date_started <= '2013-01-31 00:00:00'
and (date_terminated >= '2013-01-01 00:00:00' 
  or date_terminated is null) group by dept_id) as Jan
ON Jan.dept_id = a.id   
LEFT JOIN 
(SELECT dept_id, COUNT(emp_name) as total from employee
where date_started <= '2013-02-31 00:00:00'
and (date_terminated >= '2013-02-01 00:00:00' 
  or date_terminated is null)  group by dept_id) as Feb
ON Feb.dept_id = a.id