Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Fabricio_gnr

Consulta em duas tabelas

Recommended Posts

Prezados, help-me!!??

O problema:

Tabela “processo” e tabela “atividades_processo”

Regra:

  • processo é aberto;
  • processo é atribuído a um depto qualquer;
  • o depto atribui a outro depto;

A tabela “atividades_processo” registra todas essas acoes referentes a um processo, registrando data e hr da acao e o nome do depto que fez a acao.

O que preciso:

Preciso realizar uma consulta onde eu possa buscar os processos que, após aberto, tenham sido atribuídos ao depto “central” e que estes, tenham sido atribuídos a outro depto qualquer.

Alguem me da uma luz sobre qual caminho seguir?

Compartilhar este post


Link para o post
Compartilhar em outros sites

atividades_processotem uma hierarquia ?

Sequencial , data etc ?

Em tese dois subselects com EXISTS deveria resolver.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi, Motta. Obrigado por ajudar!

veja como eu estou fazendo:

row_number() over (partition by processo.codigo order by atividades_processo.data_acao ASC ) as linha

e na subconsulta eu faço um where onde a linha =1 and depto = central

ai resolve o primeiro caso, mas tambem necessito saber se houve uma segunda atribuiçao, que seria na linha 2, mas nao sei como.

As acoes ficam registradas por ordem de data hora e nao tenho muita experiencia com sql.
Esse banco foi desenvolvido por terceiros

Compartilhar este post


Link para o post
Compartilhar em outros sites

Faça

subconsulta um where onde a linha <> 1 and depto <> central

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fiz assim, mas nao me da o resultado esperado

with consulta as ( SELECT incident.incident_id, svd.serv_dept_n,
CASE WHEN TO_CHAR(incident.date_logged,'HH24:MI') > '14:30' and trunc(ar.date_actioned) > trunc(incident.date_logged)
THEN TO_DATE(TO_CHAR(RH.proximo_util_assyst(incident.date_logged+1),'DD/MM/YY')||' 07:30:00','DD/MM/YY HH24:MI:SS')
ELSE incident.date_logged END dtRegistro,
id.event_type, ar.date_actioned dtAcao, ar.serv_dept_id deptAcao, ar.ass_svd_id deptAtribuido,
row_number() over (partition by incident.incident_id order by ar.date_actioned ASC ) as linha
FROM incident
INNER JOIN jptsys_tabledata d on d.table_name = 'incident'
INNER JOIN inc_data id on id.incident_id = incident.incident_id
INNER join serv_dept svd on svd.serv_dept_id = incident.inc_resolve_svd
INNER join act_reg ar on ar.incident_id = incident.incident_id
INNER join act_type on act_type.act_type_id = ar.act_type_id
WHERE incident.incident_id <> 0 @WHERE_CLAUSE@
AND id.event_type not in ('d','t')
AND incident.down_flag = 'n'
AND act_type.act_type_sc = 'ASSIGN')



select incident_id from consulta
where linha = 1 and deptAtribuido = 'central' (coloquei central, mas na vdd vai o codigo)
and exists ( select incident_id from consulta where linha = 2 and deptAtribuido <> 'central' )

Compartilhar este post


Link para o post
Compartilhar em outros sites

Já pensou em usar uma FUNCTION !?

Como seria esta regra ?

Para um processo p (parametro) ...

A primeira atividade foi iniciada pelo depto x (parametro) e foi em seguida para um depto <> x

Compartilhar este post


Link para o post
Compartilhar em outros sites


and exists ( select incident_id from consulta where linha = 1 and deptAtribuido <> 'central' )

and exists ( select incident_id from consulta where linha = 2 and deptAtribuido <> 'central' )

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fazendo assim eu consegui um resultado, porém, o resultado 2 esta me dando resposta errada. Ainda não identifiquei o problema.
Ele deixa passar alguns casos que deveriam estar listados.

with consulta as ( SELECT incident.incident_id,
CASE WHEN TO_CHAR(incident.date_logged,'HH24:MI') > '14:30' and trunc(ar.date_actioned) > trunc(incident.date_logged)
THEN TO_DATE(TO_CHAR(RH.proximo_util_assyst(incident.date_logged+1),'DD/MM/YY')||' 07:30:00','DD/MM/YY HH24:MI:SS')
ELSE incident.date_logged END dtRegistro, id.event_type, ar.date_actioned dtAcao, ar.serv_dept_id deptAcao, ar.ass_svd_id deptAtribuido,
row_number() over (partition by incident.incident_id order by ar.date_actioned ASC ) as linha
FROM incident
INNER JOIN jptsys_tabledata d on d.table_name = 'incident'
INNER JOIN inc_data id on id.incident_id = incident.incident_id
INNER join act_reg ar on ar.incident_id = incident.incident_id
INNER join act_type on act_type.act_type_id = ar.act_type_id
WHERE incident.incident_id <> 0
AND id.event_type not in ('d','t')
AND incident.down_flag = 'n'
AND act_type.act_type_sc = 'ASSIGN'
and incident.date_logged between '01/12/2016' and '31/12/2016'
),

resultado1 as ( select incident_id from consulta
where linha = 1
and deptAtribuido = 9 ),

resultado2 as ( select INCIDENT_ID from consulta
where linha = 2
and deptAtribuido <> 9
and (dtAcao - dtRegistro)*24*60 <= 10 ),

resultado3 as ( select * from resultado1 union select * from resultado2 )

vou testar o que voce disse e dou retorno.
Obrgiado!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nao, deu certo.... vejam só

Eis o problema: Preciso listar o incidente_id e a hora_acao onde a acao for igual a "atribuicaoF", porem, caso haja mais de um registro em um mesmo incident_id, devo pegar apenas o segundo registro feito. Exemplo, se houver duas ou mais açoes de atribuiçao para o mesmo incident_id, devo pegar apenas a SEGUNDA. Como proceder?

https://drive.google.com/file/d/0B8yhgvv5qEqUTDI4d00tR0ExakE/view?usp=sharing

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu faria uma Function que retornaria 0 ou 1 para a Regra

A Function permite Cursores e regras mais complezas.

Apenas tormar cuidado para ela não ficar muito lenta.

caso haja mais de um registro em um mesmo incident_id, devo pegar apenas o segundo registro feito.

Este seria um cursor , algo como

for r in (select INCIDENT_ID from consulta  where  ....)
loop
  - "guarda" o último incident_id
end loop;

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.