2 независимых запроса левого соединения не будут работать вместе - PullRequest
0 голосов
/ 21 декабря 2018

В конечном итоге я хочу, чтобы мой вывод представлял собой сводный запрос, аналогичный приведенному ниже, который мне удобно выполнять

например

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

  1. Это запрос диапазона дат, который обеспечивает возврат нулей, если счетчик равен нулю для дат, в которых нет информации.Это даст что-то похожее на приведенное ниже

    Date     Count
    
    1/1/18    25
    2/1/18     5
    3/1/18     0
    4/1/18     1
    
  2. Это запрос статуса, который гарантирует, что нули возвращаются, если этот ноль отсутствует, а статус отсутствует

    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;

Ответы [ 3 ]

0 голосов
/ 21 декабря 2018

Попробуйте и дайте мне знать, какие ошибки вы получаете

--
-- 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 pi2 ON (
        st.instanceid = pi2.stat
        AND proc_oid = 150
        )
GROUP BY td.tmp_date
    ,st.instanceid
ORDER BY td.tmp_date;
0 голосов
/ 23 декабря 2018

Я решил обойти это по-другому, я использовал сводку для заполнения уставов процесса вместо использования запроса 2 и второго соединения.Работает именно так, как хотел сейчас.

select Process_created, 
    nvl(Complete, 0) as Complete,
    nvl(Error, 0) as Error,
    nvl(Running, 0) as Running,
    nvl(Abort, 0) as Abort
       from(
with tmp_dates as (
    select trunc(sysdate) - level + 1 as tmp_date
    from dual
    connect by level <= 30
)
select
    count(pi.crtd_tstmp) as number_of,
    td.tmp_date as Process_created,
    pi.stat as status
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,pi.stat
order by 
    tmp_date)src
    pivot(
sum(number_of)
for status in ('CO' as Complete, 'ER' as Error, 'RU' as Running, 'AB' as Abort )) piv order by process_created;
0 голосов
/ 21 декабря 2018

Может быть, что-то вроде этого только с одной таблицей в предложении from?

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
left join procedure_instance pi on (td.tmp_date = trunc(pi.crtd_tstmp) and proc_oid = 150)
right join status_table st on (st.instanceid = pi.stat and proc_oid = 150)
group by td.tmp_date,st.instanceid
order by tmp_date;
...