Считает, что не предоставляет итоговую стоимость - PullRequest
0 голосов
/ 16 апреля 2019

У меня есть некоторый код, настроенный для (надеюсь) отслеживания того, сколько подсказок у нас было в текущем месяце на основе местоположения наконечников и сколько наконечников у нас было за предыдущий месяц.

Синтаксис принят системой, однако он не возвращает никаких значений - просто 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`

1 Ответ

0 голосов
/ 16 апреля 2019

Я понимаю, почему вы можете получить нулевой счет для значения текущего месяца; Ваш второй подзапрос имеет:

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, поэтому я это закомментировал, но его можно полностью удалить - и отфильтровывает весь диапазон дат как что-либо после начала предыдущего месяца, и код состояния и тип параметра, который вас интересует.

Затем в каждом из положений агрегации / подсчета используется выражение регистра, чтобы решить, какие данные месяца он считает. В первом из них учитываются только задания, даты начала которых находятся после начала текущего месяца; во втором он только подсчитывает задания, даты начала которых предшествуют началу текущего месяца, т. е. в предыдущем месяце, поскольку это все, что осталось от фильтра в предложении where.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...