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

      Boa tarde galera, estou com um problema talvez por minha falta de experiência em pl/sql ainda não consegui enxergar..
      è os seguinte tenho a seguinte query:

      SELECT IDAGENDADADO, DTAGENDA
      FROM (
      SELECT DISTINCT B.IDAGENDADADO, A.DTAGENDA, H.IDTUSS
      FROM AGENDA_DETAIL A
      JOIN AGENDA_DADO B ON ( A.IDAGENDADADO = B.IDAGENDADADO )
      JOIN AGENDA_SALA C ON ( B.IDSALA = C.IDSALA )
      JOIN AGENDA_DADO_AUX H ON ( B.IDAGENDADADO = H.IDAGENDADADO )
      WHERE A.FLAG = 'DISPONIVEL' AND
      A.STATUS = 'ATIVADO' AND
      B.FLAG = 'PRODUCAO' AND
      B.STATUS = 'ATIVADO' AND
      H.IDTUSS IN (2826,78)
      )
      GROUP BY IDAGENDADADO, DTAGENDA HAVING COUNT(*) > 1 ORDER BY DTAGENDA

      A query funciona e traz o resultado esperado quando eu removo do select e do group by a coluna IDAGENDADADO, mas quando eu à coloco novamente não me traz resultados.

      O problema é que junto com as DTAGENDA que eu retorno eu precisava tbm retornar os ids das respectivas, teria alguma outra forma de fazer isso sem comprometer a consulta?

      Mto obrigado galera, e desculpem-me se for algo mto newbie 🙁

      Abs

      #97994
      Ishii
      Participante

        Olá,

        Desculpe-me mas não entendi qual ID estamos falando… o IDAGENDADADO já deve retornar na consulta, não? Ou seria outra coluna?

        Se for a coluna IDTUSS basta colocar no primeiro select e no group by e ver se isso vai retornar as linhas que vc precisa (pode ser que retorne duplicadas por exemplo).

        Se for outra coluna deverá rever as subqueries.

        []s Ishii

        #97998
        luan
        Participante

          Ola Ishii,
          então quando eu acrescento o IDAGENDADADO no group by, a consulta nao me retorna nada…agora quando eu o removo do group by a consulta me retorna as linhas esperadas.

          #97999
          Avatar photoRegis Araujo
          Participante

            Ola.!

            Bom.. se eu entendi bem..!!

            Vc falou que se coloca a coluna IDAGENDADADO no group by ele não lhe retorna nada..!!

            Bom.. vc entende o que é o GROUP BY ?? Ele faz simplesmente oq diz.. agrupa os dados.. da seguinte forma..!!

            Se em uma tabela existir 2 linhas com o mesmo conteudo em um campo.. e vc usar a clausula group by, ele irá agrupar elas em apenas 1 linha e no campo “count” vai lhe retornar quantas vezes este valor se repete.!

            O problema da sua consulta é a clausula HAVING COUNT(*) > 1

            Ou seja, a relação entre IDAGENDADADO + DTAGENDA não se repete mais de 1 vez.. e quando vc adicona IDAGENDADADO no group by e com a clausula having count(*) > 1, isto obriga a mostrar apenas as relações que possuem mais de 1 repetição..!!

            Retire o having count da sua consulta que vc terá o resultado que espera..!!

            Bom.. é por isto q não aparece nenhum resultado na sua consulta com o group by IDAGENDADADO, DTAGENDA… mas se realmente será isto que vc precisa.. não tenho como saber..!!

            Qualquer coisa.. posta ai..!!

            Espero ter ajudado..

            Abraços..!

            #98000
            fsitja
            Participante

              Tenta dessa forma:


              SELECT idagendadado, dtagenda
              FROM (SELECT b.idagendadado,
              a.dtagenda,
              count(*) over (partition by a.dtagenda) cnt
              FROM agenda_detail a
              JOIN agenda_dado b ON (a.idagendadado = b.idagendadado)
              JOIN agenda_sala c ON (b.idsala = c.idsala)
              JOIN agenda_dado_aux h ON (b.idagendadado = h.idagendadado)
              WHERE a.flag = 'DISPONIVEL'
              AND a.status = 'ATIVADO'
              AND b.flag = 'PRODUCAO'
              AND b.status = 'ATIVADO'
              AND h.idtuss IN (2826, 78)
              GROUP BY b.idagendadado, a.dtagenda)
              WHERE cnt > 1
              ORDER BY dtagenda;

              #98001
              luan
              Participante

                Valeu Thunder_Catz muito obrigado pelas explicações,
                mas no meu caso oque acontece é que eu necessito da clausura having count() pelo seguinte, eu preciso exibir os dias nas agendas apenas se tiverem disponiveis horários para todos códigos tuss:
                H.IDTUSS IN (2826,78).. Por isso uso having count(
                ) > (N -1)

                Vlw abs

                #98002
                fsitja
                Participante

                  [quote=”luan”:nw9wpa60]Valeu Thunder_Catz muito obrigado pelas explicações,
                  mas no meu caso oque acontece é que eu necessito da clausura having count() pelo seguinte, eu preciso exibir os dias nas agendas apenas se tiverem disponiveis horários para todos códigos tuss:
                  H.IDTUSS IN (2826,78).. Por isso uso having count(
                  ) > (N -1)

                  Vlw abs[/quote]

                  O que quer dizer o N-1?

                  N é o número de IDTUSS diferentes que você selecionou?

                  Se é isso talvez isso ajude a remover o 1 hardcoded:

                  SELECT idagendadado, dtagenda
                  FROM (SELECT b.idagendadado,
                  a.dtagenda,
                  count(*) over (partition by a.dtagenda) cnt
                  count(distinct h.idtuss) over () cnt_idtuss
                  FROM agenda_detail a
                  JOIN agenda_dado b ON (a.idagendadado = b.idagendadado)
                  JOIN agenda_sala c ON (b.idsala = c.idsala)
                  JOIN agenda_dado_aux h ON (b.idagendadado = h.idagendadado)
                  WHERE a.flag = 'DISPONIVEL'
                  AND a.status = 'ATIVADO'
                  AND b.flag = 'PRODUCAO'
                  AND b.status = 'ATIVADO'
                  AND h.idtuss IN (2826, 78)
                  GROUP BY b.idagendadado, a.dtagenda)
                  WHERE cnt > cnt_idtuss - 1
                  ORDER BY dtagenda;

                  #98009
                  luan
                  Participante

                    fsitja muito obrigado pela resposta.
                    Exatamente isso, N é o número de IDTUSS selecionados.

                    A query que você mandou está retornando o erro:
                    00979. 00000 – “not a GROUP BY expression”
                    Estranho que tentei acrescentar um grup by final com idagendado, dtagenda, mas o erro persiste …

                    Obrigado

                    #98024
                    luan
                    Participante

                      fsitja, resolvido, muito obrigado kra!
                      acabou ficando assim:


                      SELECT distinct idagendadado, dtagenda
                      FROM (SELECT distinct b.idagendadado,
                      a.dtagenda,
                      h.idtuss,
                      count(*) over (partition by a.dtagenda) cnt,
                      count(h.idtuss) over () cnt_idtuss
                      FROM agenda_detail a
                      JOIN agenda_dado b ON (a.idagendadado = b.idagendadado)
                      JOIN agenda_sala c ON (b.idsala = c.idsala)
                      JOIN agenda_dado_aux h ON (b.idagendadado = h.idagendadado)
                      WHERE a.flag = 'DISPONIVEL'
                      AND a.status = 'ATIVADO'
                      AND b.flag = 'PRODUCAO'
                      AND b.status = 'ATIVADO'
                      AND h.idtuss IN (2826, 78, 2636)
                      GROUP BY b.idagendadado, a.dtagenda,h.idtuss)
                      WHERE cnt > (N-1)
                      ORDER BY dtagenda;

                      Obrigado novamente galera, é muito bom poder aprender com todos os excelentes profissionais do forum!

                      Abraços[/code]

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