PL SQL-统计信息查询

时间:2019-01-25 09:30:25

标签: plsql

我需要以下查询的帮助:对于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;

有人可以帮忙吗?

2 个答案:

答案 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