Найдите отделы, которые нанимали также в те же годы, что и отдел 10. Предположим, что отдел 10 сотрудников каждый год - PullRequest
0 голосов
/ 13 октября 2019

Здравствуйте, я должен найти отделы с тем же Hiredate, что и в отделе 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

Я запутался, как получить правильные дубликаты. Может кто-нибудь, пожалуйста, помогите мне?

Ответы [ 2 ]

0 голосов
/ 13 октября 2019
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.
Если найм лет длядругой отдел должен быть точно таким же, просто раскомментируйте последнюю строку.

0 голосов
/ 13 октября 2019

Вы должны сравнить год каждого отдела с годом 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 ;
...