Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Wajabed

comandos básicos

Recommended Posts

Galera, tenho um trabalho pra fazer e tenho dúvidas bem básicas que acho que vocês poderão me ajudar com facilidade.

 

Nesse exercício por exemplo, eu sei substituir Avenida por Rua, mas não sei filtrar as que iniciam com letra C até letra H (eu só sei filtrar usando o LIKE, mas só para uma letra, não sei se dá pra fazer vários LIKE's na mesma instrução, tipo LIKE 'C%' or LIKE 'D%' or....)

 

Realize uma consulta substitua o termo Avenida por Rua na tabela de endereço e retorne todos os endereços que iniciam com a letra C e vão até a letra H.

 

Este outro por exemplo:

Realize uma consulta que retorne os cargos e seus respectivos salários, bem como um aumento que deverá corresponder a parte fracionária da divisão do salário base por 300;

Eu sei fazer utilizando o comando DECODE, mas como o cálculo será o mesmo para todos os cargos (saláriobase * 0,0033) deve haver alguma maneira mais fácil e "mais correta" de fazer, certo?

 

Se alguém puder me ajudar com essas dúvidas, ficarei muito agradecido.

Procurei aqui no fórum antes de postar, mas não sei exatamente pelo que procurar.

Obrigado pela atenção de todos.

Abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

1

 

Seria os que começam (tem a 1@ letra com) entre C e H

Ou que tem C e H Nesta ordem no nome ?

 

Pesquise por SUBSTR no 1º caso e LIKE no 2º

 

 

2

 

 

 

 

 

 

Nao entendi a regra do aumento ...

Compartilhar este post


Link para o post
Compartilhar em outros sites

questão 2 - pesquise sobre campos calculados; e como exibir com "alias".

 

não sei filtrar as que iniciam com letra C até letra H

pesquise sobre between

Compartilhar este post


Link para o post
Compartilhar em outros sites

questão 2 - pesquise sobre campos calculados; e como exibir com "alias".

 

pesquise sobre between

Então Fernando, eu só achei o uso do between em relação a números, funciona também para letras?

Obrigado!

 

 

1

 

Seria os que começam (tem a 1@ letra com) entre C e H

Ou que tem C e H Nesta ordem no nome ?

 

Pesquise por SUBSTR no 1º caso e LIKE no 2º

 

 

2

 

 

 

 

 

 

Nao entendi a regra do aumento ...

No primeiro caso, ele quer apenas ruas que comecem com as letras que estão entre C e H (C,D,E,F,G,H).

É possível usar LIKE nesse caso? Tipo LIKE 'C%' or LIKE 'D%' or LIKE 'E%' ?

No segundo caso, a regra de aumento do salário é o salário base + salário base/300.

Valeu, abraço!

 

 

Beleza galera, o primeiro eu consegui resolver utilizando o BETWEEN, que realmente achei que fosse só para números. (Valeu Fernando!!!!)

Ficou assim:

SQL> SELECT END_DESCRICAO, REPLACE(END_DESCRICAO, 'Avenida', 'Rua')

2 FROM TB_ENDERECO

3 WHERE END_DESCRICAO BETWEEN 'Rua C%' AND 'Rua H%' ;

 

Só fiquei com uma dúvida, ele vai listar também ruas que comecem com H? Porque por exemplo, uma rua chamada 'Haha' não estaria no intervalo, correto? Então eu deveria colocar no lugar, um AND 'Rua I%' ?

E teria como eu usar o UPPER pra deixar tudo maiúsculo, e depois dentro do REPLACE colocar assim:

REPLACE(END_DESCRICAO, 'AVENIDA' , 'RUA')? Tentei mas não consegui.

Obrigado novamente!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Creio que o certo seria

SQL> SELECT END_DESCRICAO, REPLACE(END_DESCRICAO, 'Avenida', 'Rua')
  2  FROM TB_ENDERECO
  3  WHERE END_DESCRICAO BETWEEN 'Avenida C%' AND 'Avenida H%' ;

pois haverá um "replace"

Compartilhar este post


Link para o post
Compartilhar em outros sites

Creio que o certo seria

SQL> SELECT END_DESCRICAO, REPLACE(END_DESCRICAO, 'Avenida', 'Rua')
  2  FROM TB_ENDERECO
  3  WHERE END_DESCRICAO BETWEEN 'Avenida C%' AND 'Avenida H%' ;

pois haverá um "replace"

Então, não sei como funciona, mas eu entendi que primeiro ele fará o REPLACE e todos Avenida passarão a ser Rua, por isso dei BETWEEN RUA E NÃO BETWEEN AVENIDA.

Vou testar jajá sua dica!

Valeu!

 

Edit: Testei como você falou, daí no caso ele achou apenas as que foram substituidas (que passaram pelo REPLACE), mas o exercício pede TODOS OS ENDEREÇOS que comecem com a letra C até a letra H.

Da forma como eu fiz, encontrou 7 resultados.

Da forma como você me passou, encontrou 3 resultados.

Agora buguei e não sei qual tá certa, hUAHAUHAHUA

Compartilhar este post


Link para o post
Compartilhar em outros sites

testa antes e depois do replace , se já houver "rua" localiza

 SELECT END_DESCRICAO, REPLACE(END_DESCRICAO, 'Avenida', 'Rua')
FROM TB_ENDERECO
 WHERE (END_DESCRICAO BETWEEN 'Avenida C%' AND 'Avenida H%' 
                or
                REPLACE(END_DESCRICAO, 'Avenida', 'Rua') BETWEEN 'Rua C%' AND 'Rua H%')

Compartilhar este post


Link para o post
Compartilhar em outros sites

testa antes e depois do replace , se já houver "rua" localiza

 SELECT END_DESCRICAO, REPLACE(END_DESCRICAO, 'Avenida', 'Rua')FROM TB_ENDERECO WHERE (END_DESCRICAO BETWEEN 'Avenida C%' AND 'Avenida H%'                 or                REPLACE(END_DESCRICAO, 'Avenida', 'Rua') BETWEEN 'Rua C%' AND 'Rua H%')

Fiz assim como você me indicou, e o resultado foi a junção dos 7 valores que encontrei com os 3 que você havia encontrado, agora acho que está certo!

Valeu!!

 

 

Quais sites eu posso postar minha tabela do BD? Para ficar mais claro para todos.

Estou com dificuldade em alguns exercícios, será que pode me ajudar?

Não me leve a mal, não estou pedindo que resolva, só que me de uma ajuda com certas coisas que não sei.

Por exemplo:

Realize uma consulta que retorne qual é o exemplar que mais gerou multa;

Eu pensei em fazer assim:

SQL> SELECT EXEPRE_CODEXEMPLAR, SUM(EXEPRE_VALORMULTA)

2 FROM TB_EXEMPLAREMPRESTIMO

3 GROUP BY EXEPRE_CODEXEMPLAR;

Mas assim ele exibe o valor das multas de todos os exemplares, mas eu não sei fazer exibir apenas o Exemplar com maior valor de multa acumulado sabe?

Obrigado novamente!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Dica , ordene pelo 2@ coluna desc

Desculpe Motta, mas não entendi o que vc disse.

Tem algum link, pode dar algum exemplo ou algo assim?

Sou muito novo com SQL ainda :(

Compartilhar este post


Link para o post
Compartilhar em outros sites

ok, sua sql

SELECT EXEPRE_CODEXEMPLAR, SUM(EXEPRE_VALORMULTA)
FROM TB_EXEMPLAREMPRESTIMO
GROUP BY EXEPRE_CODEXEMPLAR;

ordene desc

SELECT EXEPRE_CODEXEMPLAR, SUM(EXEPRE_VALORMULTA)
FROM TB_EXEMPLAREMPRESTIMO
GROUP BY EXEPRE_CODEXEMPLAR
ORDER BY 2 DESC

O "CAMPEÃO

SELECT *
FROM
(
SELECT EXEPRE_CODEXEMPLAR, SUM(EXEPRE_VALORMULTA)
FROM TB_EXEMPLAREMPRESTIMO
GROUP BY EXEPRE_CODEXEMPLAR
ORDER BY 2 DESC
) WHERE ROWNUM < 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

ok, sua sql

SELECT EXEPRE_CODEXEMPLAR, SUM(EXEPRE_VALORMULTA)FROM TB_EXEMPLAREMPRESTIMOGROUP BY EXEPRE_CODEXEMPLAR;

ordene desc

SELECT EXEPRE_CODEXEMPLAR, SUM(EXEPRE_VALORMULTA)FROM TB_EXEMPLAREMPRESTIMOGROUP BY EXEPRE_CODEXEMPLARORDER BY 2 DESC

O "CAMPEÃO

SELECT *FROM(SELECT EXEPRE_CODEXEMPLAR, SUM(EXEPRE_VALORMULTA)FROM TB_EXEMPLAREMPRESTIMOGROUP BY EXEPRE_CODEXEMPLARORDER BY 2 DESC) WHERE ROWNUM < 2

Muito obrigado Motta, era exatamente "O Campeão" que eu precisava, ficou perfeito, vlw!!

 

 

Bom, tenho umas dúvidas que vão me adiantar vários exercícios, são as seguintes:

SQL> SELECT * FROM  2  (  3  SELECT RES_CODFUNC, COUNT(RES_CODIGO)  4  FROM TB_RESERVA  5  WHERE COUNT(RES_CODIGO) > 50  6  GROUP BY RES_CODFUNC  7  ORDER BY 2 DESC  8  )

O que eu poderia usar no lugar da linha 5?

Porque dá esse erro:

ERROR at line 5:

ORA-00934: group function is not allowed here

 

Tipo, eu queria que exibisse apenas quando a contagem da coluna (RES_CODIGO) fosse maior que 50.

 

Obrigado novamente, pela atenção e paciência com um novato Motta!

Abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites
SELECT * FROM
 (
 SELECT RES_CODFUNC, COUNT(RES_CODIGO)
 FROM TB_RESERVA 
 GROUP BY RES_CODFUNC
 having COUNT(RES_CODIGO) > 50
ORDER BY 2 DESC
8 )

o "where" de um group by e o "having"

Compartilhar este post


Link para o post
Compartilhar em outros sites
SELECT * FROM ( SELECT RES_CODFUNC, COUNT(RES_CODIGO) FROM TB_RESERVA  GROUP BY RES_CODFUNC having COUNT(RES_CODIGO) > 50ORDER BY 2 DESC8 )

o "where" de um group by e o "having"

Ahhhh, por isso sempre dava erro na "minha lógica", obrigado novamente Motta!!

 

 

Em um outro exercício, eu tentei essa linha de comando:

 HAVING SUM(EXEPRE_VALORMULTA) > 3 AND EXEPRE_DTPGMUL BETWEEN '01/01/2008' AND '31/12/2008'

E dá o erro dizendo que BETWEEN não é uma expressão de grupo.

Existe algo para subistituir? (Tipo o HAVING substitui o WHERE)

Se não, como posso fazer?

Abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

o having se aplica funções de grupo sum , count avg etc

fora isto é no where

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então, fiz um where antes do group by, ficou assim o código (acho que tá certo, ao menos o resultado parece ser o esperado)

SQL> SELECT * FROM
  2  (
  3  SELECT EXEPRE_CODEXEMPLAR, SUM(EXEPRE_VALORMULTA)
  4  FROM TB_EXEMPLAREMPRESTIMO
  5  WHERE EXEPRE_DTPGMUL BETWEEN '01/01/2008' AND '31/12/2008'
  6  GROUP BY EXEPRE_CODEXEMPLAR
  7  HAVING SUM(EXEPRE_VALORMULTA)>3
  8  ORDER BY 2 DESC
  9  )
 10  ;

Obrigado novamente Motta! Está me ajudando muito mesmo :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa tarde, tudo bem?

Bom, estou com um problema em um exercício e preciso de uma ajuda

O exercício pede:

Crie uma view que armazene o título do livro, a editora, o principal autor e a categoria do mesmo;

 

Então fiz o seguinte código:

CREATE OR REPLACE VIEW V_LIVRO AS
 SELECT LIV_TITULO, EDI_NOME, AUTLIV_PRINCIPAL, CAT_DESCRICAO
  FROM TB_LIVRO, TB_EDITORA, TB_AUTORLIVRO, TB_CATEGORIA
  WHERE TB_LIVRO.LIV_CODIGO = TB_AUTORLIVRO.AUTLIV_CODLIVRO AND TB_EDITORA.EDI_CODIGO = TB_LIVRO.LIV_CODEDITORA

Pois bem, ela está exibindo o nome do livro, a editora, a categoria corretamente.

Mas no que se refere ao campo principal autor, ela só exibe Sim ou Não (eu preciso exibir o nome do principal autor nesse campo). E quando o livro tem mais de um autor, ele aparece em duas linhas, uma com o campo AUTLIV_PRINCIPAL sendo SIM, e na outra sendo NÃO...

Como posso mudar isso, para fazer aparecer o nome do principal autor?

Vlw, obrigado!

Obs: Em que site posso postar a imagem do meu BD para ficar mais fácil visualizar? Tentei pelo imgshack mas não aceitou.

 

Bom, consegui resolver o problema, o código correto ficou assim:

CREATE OR REPLACE VIEW V_LIVRO AS
 SELECT LIV_TITULO AS NOME_LIVRO, EDI_NOME AS NOME_EDITORA, AUT_NOME AS PRINCIPAL_AUTOR, CAT_DESCRICAO AS CATEGORIA
  FROM TB_LIVRO, TB_EDITORA, TB_AUTORLIVRO, TB_CATEGORIA, TB_AUTOR
  WHERE UPPER(AUTLIV_PRINCIPAL) LIKE '%SIM%' AND TB_LIVRO.LIV_CODIGO = TB_AUTORLIVRO.AUTLIV_CODLIVRO AND TB_EDITORA.EDI_CODIGO = TB_LIVRO.LIV_CODEDITORA AND AUTLIV_CODAUTOR = AUT_CODIGO AND CAT_CODIGO = LIV_CODCATEGORIA



SELECT * FROM V_LIVRO

Obrigado de qualquer forma!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Galera, to com uma dúvida, imagino que bem simples:

Como faço pra adicionar um texto antes de exibir uma variável?

Por exemplo:

O salário é de: Variável_Salário?

Vlw!

 

Edit1:

Utilizei o CONCAT e deu certo.

De qualquer forma obrigado!

 

Edit2: Estou com problemas para formatar o RG, está assim: 111111111 e gostaria de deixá-lo assim: 1.111.111-11

 

Vou postar o exercício todo caso alguém se interesse, e o meu código (quem quiser contribuir para melhorias, fique à vontade, fiz como pude)

 

Utilizando as funções de linha, crie uma consulta que retorne para cada cliente uma frase que da seguinte maneira: “O cliente Claudio Leones Bazzi possui CPF: 000.000.000-00 e RG: 0.000.000-00 e possui o prazo de devolução de 15 dias.”

 

Meu código:

SELECT CONCAT ('O cliente ' ,CLI_NOME) ||' possui CPF '|| CLI_CPF ||' e RG '|| CLI_RG ||' e possui o prazo de devolução de '||  RPAD(CLI_PRAZODEVOL, 7, ' dias')
FROM TB_CLIENTE 

Só falta mesmo formatar o RG, mas não sei como.

Vlw!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.