- Este tópico contém 8 respostas, 4 vozes e foi atualizado pela última vez 16 anos, 4 meses atrás por
fsitja.
-
AutorPosts
-
16 de novembro de 2009 às 10:27 pm #90923
thianolima
ParticipanteE ae galera to precisando de uma ajuda de voces.
Tenho uma tabela onde e guardado os chamados do sac da empresa.
Preciso fazer uma select nessa tabela onde eu consiga pegar um chamado atual e procurar se houve alguma outra ocorrencia deste mesmo cliente em 30 dias para traz, dai o chamado retornado eu devo fazer o processo novamente ate que eu encontre o primeiro chamado do cliente. Acho q conseguiria fazer isso com uma select hieraquica mas nao sei mto bem como consigo fazer isso. Alguem poderia me dar uma luz??16 de novembro de 2009 às 11:55 pm #90925Leonardo Litz
ParticipanteThianolima.
Não sei se entendi direito, mas vamos lá:
Não seria mais fácil vc pegar logo o primeiro chamado do cliente, caso ele tenha um chamado em 30 dias?
select count(*)
into v_tem_chamado_30dd
from tb_chamado
where data_chamado >= trunc(sysdate - 30)
and id_cliente = v_id_clienteif(v_tem_chamado_30dd > 0)then
select id_chamado
into v_id_chamado
from tb_chamado
where id_cliente = v_id_cliente
and data_chamado = ( select min(data_chamado)
from tb_chamado
where id_cliente = v_id_cliente);
end if;
Talvez assim resolva teu problema.
Vlw Leonardo Litz.
17 de novembro de 2009 às 12:25 am #90926thianolima
ParticipanteEntao litz, e que eu preciso mostrar para o usuario desde a raiz ate hoje.
Por exemplo o cliente ligou para arrumar o telefone na casa dele este mes, dai na semana seguinte o cliente entrou em contato novamente falando que tava com o mesmo problema, e depois de duas semanas ele ligou novamente cabrero da vida falando que o problema voltou dinovo. Dai a pessoa que for consultar vai ver que esse chamado que foi aberto agora, veio de duas reincidencias de 30 dias passados.
E por isso eu consigo por exemplo pegar o de agora e procurar 30 dias para traz entao irei encontrar o de duas semanas antes, e se eu procurar novamente com a mesma condicao encontrarei mais um chamado que foi onde tudo comecou. E isso que eu precisava fazer com o select hierarquico que acho q nao sei se ele e capaz disso pq eu vou estar fazendo a condicao connect com o mesmo campo de data da tabela e nao um campo de referencia como acontece por exemplo em uma tabela de funcionario com o campo supervisor.
Alguem pode dar uma luzzz17 de novembro de 2009 às 1:43 am #90929fsitja
ParticipanteTá na mão:
-- DADOS EXEMPLO PARA TESTE
with ch as (
select 1 cod_cliente, 20 cod_chamado, sysdate dat_chamado from dual
union select 1, 18, (sysdate - 10) from dual
union select 2, 17, (sysdate - 12) from dual
union select 1, 15, (sysdate - 20) from dual
union select 1, 11, (sysdate - 30) from dual
union select 1, 08, (sysdate - 120) from dual
union select 1, 05, (sysdate - 130) from dual)
-- FIM DADOS EXEMPLO PARA TESTE
-- INICIO DA QUERY
select level,
chm.cod_cliente,
chm.cod_chamado,
chm.dat_chamado,
chm.cod_chamado_ant,
connect_by_root chm.cod_chamado cod_ch_mais_recnt,
sys_connect_by_path(chm.cod_chamado, '=>') caminho
from (select rank() over (partition by ch.cod_cliente order by ch.dat_chamado DESC) rank_chamado,
lag(ch.cod_chamado) over (partition by ch.cod_cliente order by ch.dat_chamado ASC) cod_chamado_ant,
ch.*
from ch
) chm
start with rank_chamado = 1
connect by chm.cod_cliente = prior chm.cod_cliente
and chm.cod_chamado = prior chm.cod_chamado_ant
and chm.dat_chamado >= add_months(prior chm.dat_chamado, -1)
--and chm.rank_chamado = prior chm.rank_chamado + 1
Primeira coisa, coloquei o rank e o lag porque você pode querer saber qual o código do chamado anterior. Usar SQL analítico foi o jeito que pensei de pegar uma referência na linha anterior, ordenando pela data, particionado pelo cliente.
Se não quiser saber o LAG com o chamado anterior é só descomentar a última linha e retirar a linha com a função LAG() e remover a junção “and chm.cod_chamado = prior chm.cod_chamado_ant”.
A regra que você deu eu assumi que quando você disse 30 dias seria um mês inteiro, e coloquei um add_months(xxx, -1). Se for 30 mesmo, é só trocar a função por uma subtração: (PRIOR chm.dat_chamado – 30).
17 de novembro de 2009 às 1:48 am #90930fsitja
Participante[quote=”thianolima”:2dj83a93]Entao litz, e que eu preciso mostrar para o usuario desde a raiz ate hoje.
Por exemplo o cliente ligou para arrumar o telefone na casa dele este mes, dai na semana seguinte o cliente entrou em contato novamente falando que tava com o mesmo problema, e depois de duas semanas ele ligou novamente cabrero da vida falando que o problema voltou dinovo. Dai a pessoa que for consultar vai ver que esse chamado que foi aberto agora, veio de duas reincidencias de 30 dias passados.
E por isso eu consigo por exemplo pegar o de agora e procurar 30 dias para traz entao irei encontrar o de duas semanas antes, e se eu procurar novamente com a mesma condicao encontrarei mais um chamado que foi onde tudo comecou. E isso que eu precisava fazer com o select hierarquico que acho q nao sei se ele e capaz disso pq eu vou estar fazendo a condicao connect com o mesmo campo de data da tabela e nao um campo de referencia como acontece por exemplo em uma tabela de funcionario com o campo supervisor.
Alguem pode dar uma luzzz[/quote]Eu assumi que dava para encadear infinitamente chamados desde que o intervalo entre o último e o antecedente a ele não fosse maior que 30 dias (tecnicamente diferente de um mês, como já expliquei acima). Mas se entre o primeiro e o último chamado na cadeia pode ter no máximo 30 dias, aí a regra muda. Me avisa se fiz do jeito que você precisa ou não.
17 de novembro de 2009 às 2:18 pm #90932rwarstat
ParticipanteThianolima,
Nesse caso não seria mais fácil fazer uma query na tabela de chamados pelo código do cliente ordenando pela data do chamado? Isso te retornaria todos os chamados daquele cliente de uma maneira extremamente rápida.[]´s
Roberto17 de novembro de 2009 às 3:33 pm #90934fsitja
ParticipanteVerdade, hierárquico o desempenho fica bem pobre.
Dá pra fazer só com analytic sql também, fica mais rápido mas não creio que fique muito simples o código de qualquer forma.
17 de novembro de 2009 às 3:41 pm #90936thianolima
ParticipanteFsitja rodei seu exemplo aqui e exatemente isso que eu preciso, porem agora to estudando ele porque tem mta coisa q eu nunca vi..rs
To tentando modificar ele para a tabela do meu banco e vou postando as duvidas aqui. Heheheh um dia chego no seu nivel..rs17 de novembro de 2009 às 5:43 pm #90941fsitja
ParticipanteSe vc precisar de ajuda para adequar no seu modelo de dados é só postar as estruturas das tabelas e damos uma força.
-
AutorPosts
- Você deve fazer login para responder a este tópico.