оракул пытается заказать сотрудников компании в течение не менее 15 лет, заказанных по месяцам - PullRequest
0 голосов
/ 09 декабря 2018

оракул, пытающийся заказать сотрудников в компании не менее 15 лет, заказанных по месяцам

SELECT TO_CHAR(hire_date, 'Month') AS "Month", COUNT (*) AS "Number of Hires" 
FROM EMPLOYEES 
WHERE TO_CHAR(SYSDATE,'YYYY') - TO_CHAR(HIRE_DATE,'YYYY') >14
GROUP BY TO_CHAR(hire_date,'Month')
ORDER BY "Month";

, отображает

Month                                Number of Hires
------------------------------------ ---------------
April                                              7
August                                             9
December                                           7
February                                          13
January                                           14
July                                               7
June                                              11
March                                             17
May                                                6
November                                           5
October                                            6

Month                                Number of Hires
------------------------------------ ---------------
September

O требуемых заказов как

January
February
March

Ответы [ 2 ]

0 голосов
/ 09 декабря 2018

Запрос можно перефразировать как под, чтобы получить желаемые результаты:

select a.* from (
SELECT TO_CHAR(hire_date, 'Month') AS month, COUNT (*) AS "Number of Hires" 
FROM EMPLOYEES 
WHERE TO_CHAR(SYSDATE,'YYYY') - TO_CHAR(HIRE_DATE,'YYYY') >14
GROUP BY TO_CHAR(hire_date,'Month')) a
ORDER BY to_date('01-'||month||'-2018','DD-Month-YYYY');
0 голосов
/ 09 декабря 2018

Проблема в том, что 'Month' - строка - не годится для упорядочения, ну, в общем, месяцы.

SELECT TO_CHAR(hire_date, 'Month') AS "Month", COUNT(*) AS "Number of Hires" 
FROM EMPLOYEES 
WHERE EXTRACT(YEAR FROM SYSDATE) - EXTRACT(YEAR FROM HIRE_DATE) > 14
GROUP BY TO_CHAR(hire_date, 'Month')
ORDER BY EXTRACT(month FROM MIN(hire_date));

Обратите внимание, что вы не должны использовать арифметику для строк - это просто неоперация для строк, и вы хотите избежать неявного преобразования (потому что это может вызвать неожиданные проблемы).Итак, используйте встроенные функции для извлечения года.

Обратите внимание, что ваша логика на самом деле не сводится к тому, что «сотрудники были компанией как минимум 15 лет».Это будет:

WHERE hire_date < sysdate - interval '15' year
...