- Este tópico contém 7 respostas, 3 vozes e foi atualizado pela última vez 16 anos, 2 meses atrás por
fsitja.
-
AutorPosts
-
6 de janeiro de 2010 às 4:53 pm #91860
gsmdf
ParticipantePessoal,
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!
6 de janeiro de 2010 às 6:22 pm #91865fsitja
ParticipanteSe 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 3SQL>
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 2SQL>
6 de janeiro de 2010 às 7:51 pm #91866gsmdf
ParticipanteConcordo 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 .6 de janeiro de 2010 às 8:06 pm #91868burga
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…
6 de janeiro de 2010 às 8:14 pm #91869gsmdf
ParticipanteVerdade, está correto mesmo!
Obrigado.6 de janeiro de 2010 às 8:24 pm #91871burga
ParticipanteEntendi 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() > 1E 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… 😀
6 de janeiro de 2010 às 8:26 pm #91873gsmdf
ParticipanteÉ, só era o erro ali de colocar o cod_programa_trabalho.
Vlw =)
7 de janeiro de 2010 às 1:38 am #91878fsitja
Participantehaha ctrl+c e ctrl+v na correria pra sair pra uma reunião… foi mal. Valeu Burga. 😀
-
AutorPosts
- Você deve fazer login para responder a este tópico.