Pular para o conteúdo
  • Este tópico contém 6 respostas, 4 vozes e foi atualizado pela última vez 16 anos, 3 meses atrás por Leegemelgo.
Visualizando 7 posts - 1 até 7 (de 7 do total)
  • Autor
    Posts
  • #90940
    Leegemelgo
    Participante

      Preciso elaborar uma query que contemple a seguinte situação:
      colunas mes, codigo e estado;
      Preciso extrair as quantidades dos codigos que estão duplicados por mês, 2X, 3X e mais de 3X,
      e o mais complicado que é saber quantos códigos se repetem somente em 6 dos 6 meses, 5 dos 6 meses(exemplo: se o código foi utilizado uma vez ou mais em 5 meses dos 6 possiveis), em 4 dos 6 meses, em 3 dos 6 meses, em 2 dos 6 meses, somente 1 vez nos 6 meses;

      Estou batendo cabeça e não chego a lugar nenhum, peço ajuda a vc’s.
      Grato

      #90942
      fsitja
      Participante

        Fiquei com um monte de dúvidas, acho que fica mais fácil de entender se você der exemplo de dados de entrada e a saída esperada no relatório, por gentileza.

        Não entendi bem de que 6 meses você está falando. Seis últimos meses? Se sim, seriam 6 últimos usando que data como referência?
        E qual a definição de duplicado? Duplicado quando tem dois códigos iguais para um mesmo mês e estado, ou só mês, independente de estado?

        #90946
        Leegemelgo
        Participante

          Eu tenho uma tabela com as coluna mes e codigo, os meses envolvidos vão de 01 a 06, a tabela só possui os registros referentes a estes meses de modo que não precisarei fazer filtro por periodo. Mensalmente os codigos podem ser inseridos na base, são vários códigos e eventualmente eles podem se repetir, se isto acontecer é porque o usuário utilizou o sistema mais de uma vez naquele mes, ele podera utilizar o sistema a qualquer tempo e quantas vezes necessitar.

          Basicamente quero saber a quantidade de clientes usaram a rede nos ultimos 6 meses todos os meses pelo menos 1 vez, 2x 3x >3x.
          Então deverá haver o código todos os meses pelo menos uma vez, eu contarei este cara como 1 e somarei aos demais que se enquadram nesta condição, depois os códigos que exista todos os meses pelo menos 2 vezes, 3 e mais de 3x.

          Exemplo com dados de saída hipotéticos:
          Mes 01 02 03 04 05 06
          =1 10 10 10 10 10 10 > qtde que no mes de 01 a 06 utilizaram o sistema todos os meses pelo menos uma vez.
          =2 05 08 06 07 20 03 > …pelo menos duas vezes.
          =3 05 08 06 07 20 03 > …pelo menos tres vezes.
          >3 05 08 06 07 20 03 > …pelo mais de 3 vezes.

          Não haverá dados de entrada.
          ACHO que agora ficou mais compreensivel a questão..hehe

          Grato.

          #90954
          Ishii
          Participante

            Olá,

            Estou meio devagar hoje (acho que é o transito) e ainda não entendi muito bem exatamente o que você precisa, porém veja se o Rollup
            http://download.oracle.com/docs/cd/B19306_01/server.102/b14223/aggreg.htm#sthref1612
            Serve e te ajuda nisso, senão for isso precisaria entender melhor o relatório que você precisa…

            []s Ishii

            #90959
            fsitja
            Participante

              Fiz essa query abaixo, pelo que entendi do exemplo. Ali ficou mais fácil de entender. O restante talvez precise de um exemplo específico também.


              -- INICIO DADOS DE TESTE
              with t as (
              select trunc(sysdate, 'MM') dat_mes, 1 cod from dual
              union all select trunc(add_months(sysdate, -1), 'MM'), 1 estado from dual
              union all select trunc(add_months(sysdate, -2), 'MM'), 1 estado from dual
              union all select trunc(add_months(sysdate, -2), 'MM'), 1 estado from dual
              union all select trunc(add_months(sysdate, -2), 'MM'), 1 estado from dual
              union all select trunc(add_months(sysdate, -0), 'MM'), 5 estado from dual
              union all select trunc(add_months(sysdate, -1), 'MM'), 5 estado from dual
              union all select trunc(add_months(sysdate, -2), 'MM'), 5 estado from dual
              union all select trunc(add_months(sysdate, -3), 'MM'), 5 estado from dual
              union all select trunc(add_months(sysdate, -4), 'MM'), 5 estado from dual
              union all select trunc(add_months(sysdate, -5), 'MM'), 5 estado from dual
              union all select trunc(add_months(sysdate, -2), 'MM'), 20 estado from dual
              union all select trunc(add_months(sysdate, -2), 'MM'), 20 estado from dual
              union all select trunc(add_months(sysdate, -4), 'MM'), 20 estado from dual
              union all select trunc(add_months(sysdate, -5), 'MM'), 20 estado from dual)
              -- FIM DADOS DE TESTE
              -- INICIO DA QUERY
              select t2.dat_mes,
              count(case when num_acc_mes = 1 then 1 end) qtd_1x,
              count(case when num_acc_mes = 2 then 1 end) qtd_2x,
              count(case when num_acc_mes = 3 then 1 end) qtd_3x,
              count(case when num_acc_mes = 4 then 1 end) qtd_4x_ou_mais,
              count() qtd_total
              from (select t.dat_mes,
              t.cod,
              count(
              ) num_acc_mes
              from t
              group by t.cod, t.dat_mes) t2
              group by t2.dat_mes
              order by t2.dat_mes desc

              #90961
              burga
              Participante

                Se você quer saber dos códigos que aparecem em todos os meses, com pelo menos um dos meses aparecendo 1 vez:

                SELECT mes, codigo, count() quantidade
                FROM tabela
                WHERE codigo IN (SELECT codigo
                FROM (SELECT mes, codigo, count(
                ) quantidade
                FROM tabela
                GROUP BY mes, codigo)
                GROUP BY codigo
                HAVING count(*) > 5
                AND MIN(quantidade) = 1)
                GROUP BY mes, codigo;

                Para buscar códigos que aparecem todos os meses com no mínimo 2 repetições por mês (com um dos meses com exatamente 2 repetições) você altera essa linha:
                AND MIN(quantidade) = 1
                Para:
                AND MIN(quantidade) = 2
                mínimo 3 repetições por mes para (com um dos meses com exatamente 3 repetições):
                AND MIN(quantidade) = 3
                ou mais do que 3 repetições para:
                AND MIN(quantidade) > 3

                Lembrando que o registro que aparecer em uma consulta não aparecerá na outra.
                Agora se você quer que os registros que contém mais do que 3 repetições também apareçam em todas as outras consultas, os que possuem 3 repetições apareçam também na primeira e segunda consulta e assim por diante, você altera a igualdade e coloca uma desigualdade na condição citada, nas três primeiras consultas:

                1 ou mais:
                MIN(quantidade) > 0
                2 ou mais:
                MIN(quantidade) > 1
                3 ou mais:
                MIN(quantidade) > 2

                E a quarta consulta continua com a desigualdade > 3.

                #90965
                Leegemelgo
                Participante

                  (Vou testar e posto se deu certo….vlw)
                  Deu certo a solução apresentada pelo Burga foi perfeito para a minha necessidade (valeu Burga) quanto a solução do Fsitja passou perto, mas a forma que a query foi elaborado me deixou com várias boas ideias na cabeça (fsitja obrigado pela dica).

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