Pular para o conteúdo
Visualizando 9 posts - 1 até 9 (de 9 do total)
  • Autor
    Posts
  • #90923
    thianolima
    Participante

      E 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??

      #90925
      Avatar photoLeonardo Litz
      Participante

        Thianolima.

        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_cliente

        if(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.

        #90926
        thianolima
        Participante

          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

          #90929
          fsitja
          Participante

            Tá 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).

            #90930
            fsitja
            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.

              #90932
              rwarstat
              Participante

                Thianolima,
                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
                Roberto

                #90934
                fsitja
                Participante

                  Verdade, 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.

                  #90936
                  thianolima
                  Participante

                    Fsitja 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..rs

                    #90941
                    fsitja
                    Participante

                      Se vc precisar de ajuda para adequar no seu modelo de dados é só postar as estruturas das tabelas e damos uma força.

                    Visualizando 9 posts - 1 até 9 (de 9 do total)
                    • Você deve fazer login para responder a este tópico.