Plsql PL SQL-统计查询

Plsql PL SQL-统计查询,plsql,Plsql,我需要以下查询的帮助:对于HR oracle模式(表EMPLOYEES),请进行统计。第一列是从雇用日期算起的一年。它应该以升序区分。第二列应该是从雇用日期算起的月份。它们应该按自然顺序出现(1月、2月……),并且应该是不同的。第三列应该是每年和每月的雇佣人数 我尝试了以下方法: select distinct TO_CHAR(TO_DATE(HIRE_DATE, 'DD-MM-YYYY'),'Month') AS Month_, ltrim(TO_CHAR(HIRE_DATE,'yyyy'),

我需要以下查询的帮助:对于HR oracle模式(表EMPLOYEES),请进行统计。第一列是从雇用日期算起的一年。它应该以升序区分。第二列应该是从雇用日期算起的月份。它们应该按自然顺序出现(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;

有人能帮忙吗?

你认为下面是你想要的吗

SELECT to_char(hire_date, 'YYYY') year, to_char(hire_date, 'Month') month, count(*) 
FROM employees 
GROUP BY to_char(hire_date, 'YYYY'), to_char(hire_date, 'Month') 
ORDER BY to_char(hire_date, 'YYYY'), to_date(to_char(hire_date, 'Month'), 'MM');

您与当前查询非常接近,但似乎误解了聚合查询的工作方式。您有一个GROUPBY(这是正确的),还有一个distinct——您不需要distinct,因为聚合查询会为每个组输出一行

从你的问题来看,似乎你想找到每个月雇佣的员工数量,所以每个月和每年都是你的团队。然后,您只需计算每月的员工人数

这意味着您的基本查询将类似于:

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;
注意:在最初的查询中,您对日期数据类型中已经存在的内容使用了
TO_DATE()
。请不要这样做,因为如果这样做,Oracle必须进行一些隐式转换,这意味着
到日期(,'')
变成:

to_date(to_char(<date>, '<nls_date_format>'), '<some format mask>')
截止日期(截止字符(,“”),“”) 如果nls_date_format参数的格式与您要求的格式掩码不匹配,则极有可能发生错误


您可以在字符串上使用to_date,在日期上使用to_char,但请不要在日期上使用to_date或在字符串上使用to_char。

我无法理解您的问题。请编辑您的问题以使其更清晰,并附加正确的标记(这不是plsql)。理想情况下,显示示例输入和输出记录;它将按字母顺序排列月列,而不是按月份顺序。年和月应该是不同的。@Boneist-true-代码修改为按年/月数排序,而不是按字母顺序。@user10966491当有分组依据时,不需要区分,查看SQL的结果,您将看到每个年/月组合只有一行。@JordenAllcock,orderby不起作用;您正在尝试使用“mm”将字符串(如“July”)转换为日期作为格式掩码。这将是错误的。年和月应该是不同的。此外,月应该从1月到12月排序。年和月是不同的,顺序正确;您没有尝试最后的查询吗?如果您不理解聚合查询如何为每个组返回一行(即分组中的列)然后你需要对它们进行更多的研究,并与它们一起玩以更好地理解它们。请看:这是你查询的结果。这是不对的。它怎么不正确?年份是按升序排列的,月份是按“自然”排列的月份顺序,并且每年的月份组合是唯一的。这就是你的问题所要求的,不是吗?例如,2002年应该只有一个,但你有更多。月份不是按自然顺序排列的:1月、2月、3月、12月。