【问题标题】:Oracle SQL - Count number of jobs per monthOracle SQL - 计算每月的作业数
【发布时间】:2019-11-08 13:51:31
【问题描述】:

我正在统计每个月某个类型的工作 (G012) 出现的总次数,每个区域的 status_code 为“5200”。

我目前的代码是:

select area.area_name, count(area.area_name)
from area
inner join central_site on central_site.area_code = area.area_code
inner join job on job.site_code = central_site.site_code
inner join job_type on job.job_type_key = job_type.job_type_key
inner join job_status_log on job.job_number = job_status_log.job_number
where job_type.job_type_key = 'G012' and job_status_log.status_code = '5200'
group by area.area_name
order by area.area_name

我不确定如何计算,以便每个月都属于不同的类别 - 但我想最终得到的是:

Area             April     May     June    July    August    September    October
North Ward         2        5        3       2        7         4            3
South Ward         2        3        4       4        6         4            4

【问题讨论】:

  • 您的数据库中有日期列吗?
  • 你考虑过pivot吗?
  • 日期列将来自 job.actual_start_date
  • 我对 Oracle SQL 比较陌生,不知道枢轴是什么
  • 不同年份的月份应该被视为一组吗?

标签: sql oracle count


【解决方案1】:

基本上您还必须按月份对数据进行分组:

select area.area_name,  EXTRACT(MONTH FROM job.actual_start_date) mon,  count(area.area_name)
from area
inner join central_site on central_site.area_code = area.area_code
inner join job on job.site_code = central_site.site_code
inner join job_type_key on job.job_type_key = job_type.job_type_key
inner join job_status_log on job.job_number = job_status_log.job_number
where job_type.job_type_key = 'G012' and job_status_log.status_code = '5200'
group by area.area_name,  EXTRACT(MONTH FROM job.actual_start_date)
order by area.area_name

您也可以使用TO_CHAR(job.actual_start_date, 'Month') 代替EXTRACT(MONTH FROM job.actual_start_date) 作为名称而不是数字。

要获得所需的输出(将月份作为列而不是行),您可以使用数据透视:

SELECT *
  FROM (select area.area_name,  EXTRACT(MONTH FROM job.actual_start_date) mon
          from area
         inner join central_site on central_site.area_code = area.area_code
         inner join job on job.site_code = central_site.site_code
         inner join job_type_key on job.job_type_key = job_type.job_type_key
         inner join job_status_log on job.job_number = job_status_log.job_number
         where job_type.job_type_key = 'G012' and job_status_log.status_code = '5200')
PIVOT (
  COUNT(*)
  FOR mon IN (1 AS January, 2 AS February, 3 AS March, 4 AS April, 5 AS May, 6 AS June, 7 AS July, 8 AS August, 9 AS September, 10 AS October, 11 AS November, 12 AS December)
)

要按年份分隔数据,只需在现在有EXTRACT(MONTH FROM job.actual_start_date) 的任何地方添加一个EXTRACT(YEAR FROM job.actual_start_date) 列。

【讨论】:

  • 谢谢你 - 但它现在给我错误消息 [Oracle][ODBC][Ora]ORA-01722: invalid number
  • 嗯,基本查询对我有用,但我无法使用您的内部选择进行测试。我认为你的数据一定有问题。 job.actual_start_date 是什么数据类型?
  • job.actual_start_date 是一个日期时间字段,返回诸如 01/02/2019 12:13:34 之类的值。想知道是不是因为它试图总计 area.area_name 而这不是数字而是文本?
  • 不,它与 area_name 字符串无关。必须有一些等式将 varchar2 与数字进行比较,最有可能在连接条件之一中。这没有问题,因为 oracle 会执行隐式转换,直到获取非数值。
  • 它也可能是您应用程序中的调用点。也许您已将返回值定义为 varchar2, integer,现在添加了一个新列 mon,其中月份的名称作为新的第二列,它不会返回预期的整数而是新的月份字符串。
猜你喜欢
  • 1970-01-01
  • 2012-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多