我需要以下查询的帮助:对于HR oracle模式(表EMPLOYEES),进行统计。第一列是从HIRE_DATE起的一年。它应该与升序不同。第二列应该是从HIRE_DATE起的几个月。它们应以自然顺序显示(1月,2月,...),并且应与众不同。第三栏应该是每年零一个月的雇用人数。
我尝试了以下方法:
select distinct TO_CHAR(TO_DATE(HIRE_DATE, 'DD-MM-YYYY'),'Month') AS Month_, ltrim(TO_CHAR(HIRE_DATE,'yyyy'),'0') AS Year_
--count(ltrim(TO_CHAR(HIRE_DATE,'yyyy'),'0')) AS Num_of_employees
from employees
group by HIRE_DATE;
有人可以帮忙吗?
答案 0 :(得分:0)
您与当前查询非常接近,但是您似乎误解了聚合查询的工作方式。您有一个分组依据(是正确的),也有一个不同的分组-不需要不同的分组,因为聚合查询每组输出一行。
从您的问题来看,您似乎想查找每月雇用的员工人数,因此月份和年份是您的组。然后,您只需要计数就可以找到每月的雇员人数。
这意味着您的基本查询将类似于:
select trunc(hire_date, 'mm') mon_yr, -- truncates the date to the start of the date's current month (e.g. 25th Jan 2019 would get truncated to 1st Jan 2019)
count(*) num_employees
from employees
group by trunc(hire_date, 'mm');
一旦有了它,就可以很容易地将日期分割成几个组成部分,同时保留顺序,例如:
select to_char(mon_yr, 'yyyy') yr,
to_char(mon_yr, 'fmMonth') mon, -- used fm in the format model to avoid the extra spaces that would be returned without it
num_employees
from (select trunc(hire_date, 'mm') mon_yr,
count(*) num_employees
from employees
group by trunc(hire_date, 'mm'))
order by mon_yr;
在原始查询中,您在{ATE}数据类型中使用TO_DATE()
。请不要永远这样做,因为如果这样做,Oracle必须进行一些隐式转换,这意味着to_date(<date>, '<some format mask>')
变为:
to_date(to_char(<date>, '<nls_date_format>'), '<some format mask>')
如果您的nls_date_format参数的格式与您要求的格式掩码不匹配,则很可能会发生错误。
您可以在字符串内容上使用to_date,在日期对象上使用to_char,但绝对不要在日期上使用to_date或在字符串上使用to_char。
答案 1 :(得分:-1)
想想下面是你所追求的吗?
res