甲骨文试图按月订购至少15年的公司员工

时间:2018-12-09 13:27:25

标签: sql oracle sql-order-by

Oracle试图按月订购至少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 :(得分:3)

问题在于'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

答案 1 :(得分:1)

查询可以重新措辞如下以获得所需的结果:

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');