В конечном итоге я хочу, чтобы мой вывод представлял собой сводный запрос, аналогичный приведенному ниже, который мне удобно выполнять
например
Date CO RU ER AB
1/1/18 5 20 0 0
2/1/18 0 5 0 0
3/1/18 0 0 0 0
4/1/18 1 0 0 0
Однако, чтобы добраться до этой точки, я хочу заполнить свои данныеустановить в ноль, где данных не существует
Таблица содержит данные, подобные следующим
Date/time Process_type Status
1/1/18 10:05 150 RU
2/1/18 14:00 150 CO
4/1/18 18:00 100 ER
В любой данный день не может быть процессов.
Я написал 2запросы, целью которых было заполнить пробелы в данных.то есть.заполнить дни и статусы нулевым счетом, если такая комбинация не существует.
Это запрос диапазона дат, который обеспечивает возврат нулей, если счетчик равен нулю для дат, в которых нет информации.Это даст что-то похожее на приведенное ниже
Date Count
1/1/18 25
2/1/18 5
3/1/18 0
4/1/18 1
Это запрос статуса, который гарантирует, что нули возвращаются, если этот ноль отсутствует, а статус отсутствует
status count
AB 0
RU 2
CO 25
ER 0
Я хочу объединить два запроса, чтобы получить нулевые значения как для дат, так и для состояния, если счетчик равен нулю.
Date Status Count
1/1/18 AB 0
1/1/18 CO 0
1/1/18 ER 0
1/1/18 RU 0
2/1/18 AB 0
2/1/18 CO 6
3/1/18 ER 0
4/1/18 RU 1
Когда я присоединяюсь к ним в Query 3, он не запуститсяи получает следующую ошибку.Я пробовал несколько разных способов без радости.
Отчет об ошибке -
Ошибка SQL: ORA-00904: "TD". "TMP_DATE": неверный идентификатор
00000 - «% s: неверный идентификатор»
Запрос 1
--
-- Working out dates with nulls if zero count
--
with tmp_dates as (
select trunc(sysdate) - level + 1 as tmp_date
from dual
connect by level <= 5
)
select
count(pi.crtd_tstmp),
td.tmp_date
from
tmp_dates td
left join procedure_instance pi
on (td.tmp_date = trunc(pi.crtd_tstmp) and proc_oid = 150)
group by
td.tmp_date
order by
tmp_date;
Запрос 2
--
-- Working with Categories with zero if no category
--
with status_table as (
select 'CO' as instanceid from dual union
select 'RU' as instanceid from dual union
select 'ER' as instanceid from dual union
select 'AB' as instanceid from dual
)
select
count(pi.crtd_tstmp),
st.instanceid
from
status_table st
left join procedure_instance pi
on (st.instanceid = pi.stat and proc_oid = 150)
group by
st.instanceid
order by
st.instanceid;
Запрос 3
--
-- join together
--
with tmp_dates as (
select trunc(sysdate) - level + 1 as tmp_date
from dual
connect by level <= 5
),
status_table as (
select 'CO' as instanceid from dual union
select 'RU' as instanceid from dual union
select 'ER' as instanceid from dual union
select 'AB' as instanceid from dual
)
select
count(pi.crtd_tstmp),
td.tmp_date,
st.instanceid
from
tmp_dates td,
status_table st
left join procedure_instance pi
on (td.tmp_date = trunc(pi.crtd_tstmp) and proc_oid = 150)
left join procedure_instance pi
on (st.instanceid = pi.stat and proc_oid = 150)
group by
td.tmp_date,
st.instanceid
order by
tmp_date;