Sql 用于检索员工计数的单个查询

Sql 用于检索员工计数的单个查询,sql,oracle,pivot,Sql,Oracle,Pivot,我有一个包含以下字段的employee表 员工(id、姓名、加入日期、工资、部门) 我想检索每个部门过去1天、2天、3天和4天内加入公司的所有员工人数。请在下面的链接中查看我需要的结果 样本结果: 如果你想在过去的24小时内,在24到48小时之间,等等 SELECT dept, COUNT( CASE WHEN joiningDate BETWEEN SYSDATE - 1 AND SYSDATE THEN 1 ELSE NULL END ) AS day1,

我有一个包含以下字段的employee表

员工(id、姓名、加入日期、工资、部门)

我想检索每个部门过去1天、2天、3天和4天内加入公司的所有员工人数。请在下面的链接中查看我需要的结果

样本结果:


如果你想在过去的24小时内,在24到48小时之间,等等

SELECT dept,
       COUNT( CASE WHEN joiningDate BETWEEN SYSDATE - 1 AND SYSDATE     THEN 1 ELSE NULL END ) AS day1,
       COUNT( CASE WHEN joiningDate BETWEEN SYSDATE - 2 AND SYSDATE - 1 THEN 1 ELSE NULL END ) AS day2,
       COUNT( CASE WHEN joiningDate BETWEEN SYSDATE - 3 AND SYSDATE - 2 THEN 1 ELSE NULL END ) AS day3,
       COUNT( CASE WHEN joiningDate BETWEEN SYSDATE - 4 AND SYSDATE - 3 THEN 1 ELSE NULL END ) AS day4,
       COUNT( CASE WHEN joiningDate BETWEEN SYSDATE - 5 AND SYSDATE - 4 THEN 1 ELSE NULL END ) AS day5
FROM   Employee
GROUP BY dept;

如果您昨天、2天前、3天前等需要它,请将
TRUNC()
包装在
SYSDATE

的每个实例周围,以下内容将为您提供所需内容:

SELECT DEPT,
       SUM(CASE WHEN TRUNC(SYSDATE) - TRUNC(JOININGDATE) = 1 THEN 1 ELSE 0 END) AS day1,
       SUM(CASE WHEN TRUNC(SYSDATE) - TRUNC(JOININGDATE) = 2 THEN 1 ELSE 0 END) AS day2,
       SUM(CASE WHEN TRUNC(SYSDATE) - TRUNC(JOININGDATE) = 3 THEN 1 ELSE 0 END) AS day3,
       SUM(CASE WHEN TRUNC(SYSDATE) - TRUNC(JOININGDATE) = 4 THEN 1 ELSE 0 END) AS day4,
       SUM(CASE WHEN TRUNC(SYSDATE) - TRUNC(JOININGDATE) = 5 THEN 1 ELSE 0 END) AS day5
FROM EMPLOYEE
GROUP BY DEPT
ORDER BY DEPT;

如果我们有pivot标签,为什么不使用
pivot

select * from (
    select dept, trunc(sysdate)-trunc(joiningDate) dt
      from employee where joiningDate >= trunc(sysdate)-5)
  pivot (count(1) for dt in (1 day1, 2 day2, 3 day3, 4 day4, 5 day5)) 
  order by dept

请向我们展示您迄今为止所做的尝试。是否可以从计数中排除周末?类似于:
COUNT(在TRUNC(SYSDATE)之间连接日期时的大小写)-何时添加字符(SYSDATE,'D')>1,然后1其他3结束,以及TRUNC(SYSDATE)-何时添加字符(SYSDATE,'D')>1,然后0其他2结束,然后1其他空结束)但是,作为第1天,请注意
NLS_TERRITORY
将影响
'D'
参数返回的值-请参见此处:是否可以从计数中排除周末?我希望您可以这样做。