我设置了一些代码,以(希望地)根据飞顶位置监视本月我们有多少飞顶,以及上个月有多少飞顶。
该语法已被系统接受,但不会带回任何值-仅为0。
我是Oracle SQL的新手,认为我需要将子查询链接到主查询,但不确定如何操作
我想要实现的是一张表,上面写着:
Location Type Current Month Last Month
Back Alley 132 203
Rail Land 4 23
我的代码是:
select parameter_value.param_value_name as Fly_tip_location,
(select count (parameter_value.param_value_name) from job
inner join job_attribute on job.job_number = job_attribute.job_number
inner join parameter_value on parameter_value.param_type_code = job_attribute.param_type_code and
parameter_value.param_value_code = job_attribute.param_value_code
inner join job_status_log on job.job_number = job_status_log.job_number and job.job_log_number = job_status_log.job_log_number
inner join job_status on job_status.status_code = job_status_log.status_code
where job_attribute.param_type_code = 'FT02' and
job_status.status_code = '5200' and
job.actual_start_date >= TRUNC(ADD_MONTHS(SYSDATE, -1), 'MM')
AND job.actual_start_date < TRUNC(SYSDATE, 'MM')) as Last_Month_Total,
(select count (parameter_value.param_value_name) from job
inner join job_attribute on job.job_number = job_attribute.job_number
inner join parameter_value on parameter_value.param_type_code = job_attribute.param_type_code and
parameter_value.param_value_code = job_attribute.param_value_code
inner join job_status_log on job.job_number = job_status_log.job_number and job.job_log_number = job_status_log.job_log_number
inner join job_status on job_status.status_code = job_status_log.status_code
where job_attribute.param_type_code = 'FT02' and
job_status.status_code = '5200' and
job.actual_start_date >= TRUNC(ADD_MONTHS(SYSDATE, 0), 'MM')
AND job.actual_start_date < TRUNC(SYSDATE, 'MM')) as Current_Month_Total
from job
inner join job_attribute on job.job_number = job_attribute.job_number
inner join parameter_value on parameter_value.param_type_code = job_attribute.param_type_code and
parameter_value.param_value_code = job_attribute.param_value_code
inner join job_status_log on job.job_number = job_status_log.job_number and job.job_log_number = job_status_log.job_log_number
inner join job_status on job_status.status_code = job_status_log.status_code
group by parameter_value.param_value_name
order by parameter_value.param_value_name`
答案 0 :(得分:0)
我明白了为什么您可能会对当前月份的值计数为零;您的第二个子查询具有:
job.actual_start_date >= TRUNC(ADD_MONTHS(SYSDATE, 0), 'MM')
AND job.actual_start_date < TRUNC(SYSDATE, 'MM'))
与
相同job.actual_start_date >= TRUNC(SYSDATE, 'MM')
AND job.actual_start_date < TRUNC(SYSDATE, 'MM'))
,列值不能同时为>=
和 <
。
我不确定您为什么上个月也将获得零计数-如果没有相关性,我希望这个数字可能比您想要的高,但不为零,因此也许我们可以在数据中包含一些东西。看不到。
无论如何...正如@ PM77-1所建议的,您可以使用条件聚合来简化此操作,例如:
select pv.param_value_name as fly_tip_location,
count(case when j.actual_start_date >= trunc(sysdate, 'MM') then j.job_number end) as current_month,
count(case when j.actual_start_date < trunc(sysdate, 'MM') then j.job_number end) as last_month
from job j
join job_status_log jsl on jsl.job_number = j.job_number
and jsl.job_log_number = j.job_log_number
--join job_status js on js.status_code = jsl.status_code -- not needed
join job_attribute ja on ja.job_number = j.job_number
join parameter_value pv on pv.param_type_code = ja.param_type_code
and pv.param_value_code = ja.param_value_code
where j.actual_start_date >= trunc(add_months(sysdate, -1), 'MM')
and jsl.status_code = '5200'
and pv.param_type_code = 'FT02'
group by pv.param_value_name
order by pv.param_value_name;
这一次打完所有表格-您不需要job_status
,因此我已将其注释掉,但可以将其完全删除-并在上一个日期开始后对整个日期范围进行过滤月份,以及您感兴趣的状态代码和参数类型。
然后在每个aggregation / count子句中,它使用一个case表达式来确定要计算的月份数据。在第一个中,它仅计算开始日期在当月开始之后的作业;在第二个中,它仅计算开始日期在当前月份开始之前(即上个月)的作业,因为这是where
子句中的过滤器所留下的全部内容。