Pular para o conteúdo
Visualizando 8 posts - 1 até 8 (de 8 do total)
  • Autor
    Posts
  • #91860
    gsmdf
    Participante

      Pessoal,

      Tenho uma tabela X com os campos:

      COD_FISCALIZACAO (PK, NUMBER 5)
      COD_PROGRAMA_TRABALHO (PK, NUMBER 6)
      SE_ESPECIFICO_OBJETO_FISCALIZA (CHAR)
      SE_PRINCIPAL (CHAR)

      Como ficaria o SQL para:

      1)Retornar casos que COD_FISCALIZACAO é igual (mesma fiscalização) porém ocorre 2 ou mais vezes o campo SE_PRINCIPAL setado com ‘S’.

      2) Retornar casos que COD_PROGRAMA_TRABALHO é igual (mesmo programa de trabalho), COD_FISCALIZAÇÂO é diferente e o campo SE_ESPECIFICO_OBJETO_FISCALIZA está setado 2 ou mais vezes como ‘S’. [Análogo ao caso 1 ]

      Grato!

      #91865
      fsitja
      Participante

        Se entendi bem sua necessidade, acho que isso abaixo atende:


        SQL> CREATE TABLE x (
        2 cod_fiscalizacao NUMBER(5),
        3 cod_programa_trabalho NUMBER(6),
        4 se_especifico_objeto_fiscaliza char(1)
        5 NOT NULL CHECK (se_especifico_objeto_fiscaliza IN ('S', 'N')),
        6 se_principal char(1)
        7 NOT NULL CHECK (se_principal IN ('S', 'N')),
        8 CONSTRAINT pk_x
        9 PRIMARY KEY (cod_fiscalizacao, cod_programa_trabalho));

        Table created

        SQL>
        SQL> BEGIN
        2 INSERT INTO x VALUES (1, 1, 'S', 'S');
        3 INSERT INTO x VALUES (1, 2, 'N', 'S');
        4 INSERT INTO x VALUES (1, 3, 'N', 'N');
        5 INSERT INTO x VALUES (1, 4, 'N', 'S');
        6 INSERT INTO x VALUES (1, 5, 'S', 'N');
        7 --
        8 INSERT INTO x VALUES (2, 6, 'S', 'S');
        9 INSERT INTO x VALUES (3, 6, 'N', 'S');
        10 INSERT INTO x VALUES (4, 6, 'N', 'N');
        11 INSERT INTO x VALUES (5, 6, 'N', 'S');
        12 INSERT INTO x VALUES (6, 6, 'S', 'N');
        13 END;
        14 /

        PL/SQL procedure successfully completed

        SQL> commit;

        Commit complete

        SQL>
        SQL> select x.cod_fiscalizacao,
        2 x.se_principal,
        3 count() qtd_principal
        4 from x
        5 where x.se_principal = 'S'
        6 group by x.cod_fiscalizacao,
        7 x.se_principal
        8 having count(
        ) > 1
        9 /

        COD_FISCALIZACAO SE_PRINCIPAL QTD_PRINCIPAL


                   1 S                        3
        

        SQL>
        SQL> select x.cod_fiscalizacao,
        2 x.se_especifico_objeto_fiscaliza,
        3 count() qtd_esp_obj_fisc
        4 from x
        5 where x.se_especifico_objeto_fiscaliza = 'S'
        6 group by x.cod_fiscalizacao,
        7 x.se_especifico_objeto_fiscaliza
        8 having count(
        ) > 1
        9 /

        COD_FISCALIZACAO SE_ESPECIFICO_OBJETO_FISCALIZA QTD_ESP_OBJ_FISC


                   1 S                                             2
        

        SQL>

        #91866
        gsmdf
        Participante

          Concordo quanto a primeira solução.
          Porém a segunda solução,a meu ver, não contempla a condição que diz que tem que ser um mesmo programa de trabalho, ela agrupa apenas por código de fiscalização e a variável se_especifico_objeto_fiscaliza setada como ‘S’.
          Ou estou enganado ?

          No caso da sua simulação não era para retornar nada.
          Retornaria se, suponha, houvesse um programa de trabalho = 1 com fiscalização = 1 , se_esp_obj_fisc = ‘S’ e fiscalização = 2 com se_esp_obj_fisc = ‘S’ também .

          #91868
          burga
          Participante

            [quote=”gsmdf”:2f5p2b0n]Concordo quanto a primeira solução.
            Porém a segunda solução,a meu ver, não contempla a condição que diz que tem que ser um mesmo programa de trabalho, ela agrupa apenas por código de fiscalização e a variável se_especifico_objeto_fiscaliza setada como ‘S’.
            Ou estou enganado ?

            No caso da sua simulação não era para retornar nada.
            Retornaria se, suponha, houvesse um programa de trabalho = 1 com fiscalização = 1 , se_esp_obj_fisc = ‘S’ e fiscalização = 2 com se_esp_obj_fisc = ‘S’ também .[/quote]

            Na verdade não,

            Visto que o COD_FISCALIZACAO mais o COD_PROGRAMA_TRABALHO formam uma PK. Assim, nunca existirá registros com o mesmo COD_FISCALIZACAO e COD_PROGRAMA_TRABALHO. 😀

            Os dois selects do fsitja estão corretos…

            #91869
            gsmdf
            Participante

              Verdade, está correto mesmo!
              Obrigado.

              #91871
              burga
              Participante

                Entendi e agora vi o erro no segundo select do fsitja… rs!
                (erro de ctrl+c ctrl+v) 😆

                Segue o select dele corrigido!

                select x.cod_programa_trabalho,
                x.se_especifico_objeto_fiscaliza,
                count() qtd_esp_obj_fisc
                from x
                where x.se_especifico_objeto_fiscaliza = 'S'
                group by x.cod_programa_trabalho,
                x.se_especifico_objeto_fiscaliza
                having count(
                ) > 1

                E se quiser retornar as tuplas ainda, utilize o select acima como subquery:


                select *
                from x
                where (cod_programa_trabalho, se_especifico_objeto_fiscaliza) in
                (select x.cod_programa_trabalho,
                x.se_especifico_objeto_fiscaliza
                from x
                where x.se_especifico_objeto_fiscaliza = 'S'
                group by x.cod_programa_trabalho,
                x.se_especifico_objeto_fiscaliza
                having count(*) > 1 )

                Isso deve resolver pra vc… 😀

                #91873
                gsmdf
                Participante

                  É, só era o erro ali de colocar o cod_programa_trabalho.

                  Vlw =)

                  #91878
                  fsitja
                  Participante

                    haha ctrl+c e ctrl+v na correria pra sair pra uma reunião… foi mal. Valeu Burga. 😀

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