【问题标题】:Find departments which hired also the same years as department 10 did. Suppose department 10 hires every year查找与第 10 部门聘用的年份相同的部门。假设部门每年招聘 10 人
【发布时间】:2019-10-12 21:22:36
【问题描述】:

您好,我应该找到与 dept 10 具有相同雇用日期的部门。我还必须使用 YEAR() 函数和聚合函数。结果表应如下所示:

    deptnum  first    last   count
    -------------------------------
    10      1999      2000     2
    20      1999      2000     2

这是我到目前为止所做的:

SELECT e.deptnum, YEAR(e.hiredate) AS first, YEAR (e.hiredate) AS last, COUNT(*) AS count
FROM emp AS e
WHERE e.deptnum IN (SELECT e.deptno
FROM emp AS e1
WHERE e.deptnum=10)
GROUP BY e.deptnum, YEAR(e.hiredate)
HAVING COUNT(e.deptnum)>1 ;

这是我的 SQL 的结果表:

    deptnum  first    last   count
    -------------------------------
    10      1999      1999     2

我很困惑如何获得正确的副本。有人可以帮帮我吗?

【问题讨论】:

  • 找到与部门 10 具有相同雇用日期的部门:一个部门没有hiredate,是吗?那么这句话究竟是什么意思呢?
  • 即使是第一个雇用日期和最后一个雇用日期也很常见。我想这是一个最小和最大的雇佣日期

标签: sql count duplicates db2 aggregate-functions


【解决方案1】:

您应该将每个部门的年份与部门 10 的年份进行比较,如下所示,因为比较是按部门而不在部门内进行的

   SELECT e.deptnum, YEAR(e.hiredate) 
 AS first, YEAR (e.hiredate) AS last, 
   COUNT(*) AS count
    FROM emp AS e
  WHERE YEAR(e.hiredate)  IN (SELECT  
    Year(e.hiredate)
    FROM emp AS e1
   WHERE e.deptnum=10) and 
  e.deptnum<>10
 GROUP BY e.deptnum, 
  YEAR(e.hiredate)
   HAVING COUNT(e.deptnum)>1 ;

【讨论】:

  • 刚刚测试过,结果还是一样。
  • 我明白了,因为我忘了在那个 e 的地方添加一个条件。部门名称10 立即检查
  • 这样我得到了空列,我认为是因为 e.deptnum=10 然后不等于 10。
  • 不,如果您在外部查询中给出 deptname=10 则没有必要将其与只有 deptname 10 的内部查询匹配。您是否运行了我发布的上述查询以及为什么您有相同的查询表格数据显示的第一列和最后一列是两个不同的日期
  • 是的,我确实运行了上面的确切查询,但我得到了空值,我为相同的列尝试了 MAX 和 MIN,但一切都保持不变
【解决方案2】:
WITH EMP (DEPTNUM, HIREDATE) AS 
(
-- Sample Data Block
-- You may replace it by your own SELECT statement
-- returning the same columns 
VALUES
  (10, DATE('2017-01-01'))
, (10, DATE('2017-01-01'))
, (10, DATE('2018-01-01'))
, (10, DATE('2019-01-01'))

, (11, DATE('2017-01-01'))
, (11, DATE('2017-01-01'))
, (11, DATE('2018-01-01'))
, (11, DATE('2018-01-01'))
, (11, DATE('2019-01-01'))

, (12, DATE('2016-01-01'))
, (12, DATE('2017-01-01'))
, (12, DATE('2018-01-01'))

, (13, DATE('2016-01-01'))
, (13, DATE('2017-01-01'))
, (13, DATE('2018-01-01'))
, (13, DATE('2019-01-01'))
-- End of Sample Data Block
)
, HIRE_YEAR AS 
(
-- All hiring years by department 
SELECT DISTINCT DEPTNUM, YEAR(HIREDATE) AS HIREYEAR
FROM EMP
)
, HIRE_CNT AS 
(
-- Count of hiring years by department
SELECT DEPTNUM, COUNT(1) AS YEAR_CNT
FROM HIRE_YEAR
GROUP BY DEPTNUM
)
, AGG AS 
(
-- Count of THE SAME hiring years for other departments
SELECT H.DEPTNUM, COUNT(1) AS COUNT
FROM HIRE_YEAR H10
JOIN HIRE_YEAR H ON H.DEPTNUM <> H10.DEPTNUM AND H.HIREYEAR = H10.HIREYEAR
WHERE H10.DEPTNUM = 10
GROUP BY H.DEPTNUM
)
-- Count of the same hiring years for a department 
-- must be equal to TOTAL COUNT:
-- for DEPTNUM = 10 
-- and for this DEPTNUM itself, if there is an additional requirement for this department 
-- to hire the same years ONLY as DEPTNUM = 10 (commented out below)   
SELECT A.*
FROM AGG A
JOIN HIRE_CNT H10 ON H10.DEPTNUM = 10 AND H10.YEAR_CNT = A.COUNT
--JOIN HIRE_CNT H ON H.DEPTNUM = A.DEPTNUM AND H.YEAR_CNT = A.COUNT 
;

|DEPTNUM    |COUNT      |
|-----------|-----------|
|11         |3          |
|13         |3          |

您可以按原样运行此语句。可以对样本数据进行任何更改以查看它对结果的影响。
DEPTNUM = 13 在结果集中,因为它具有 DEPTNUM = 10 的招聘年限的超集。
如果另一个部门的招聘年限必须完全相同,只需取消最后一行的注释即可。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-14
    • 2013-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多