Wajabed 0 Denunciar post Postado Julho 30, 2015 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
Motta 645 Denunciar post Postado Julho 30, 2015 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
Fernando C 128 Denunciar post Postado Julho 30, 2015 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
Wajabed 0 Denunciar post Postado Julho 30, 2015 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
Motta 645 Denunciar post Postado Julho 30, 2015 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
Wajabed 0 Denunciar post Postado Julho 30, 2015 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
Motta 645 Denunciar post Postado Julho 30, 2015 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
Wajabed 0 Denunciar post Postado Julho 30, 2015 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
Motta 645 Denunciar post Postado Julho 30, 2015 Dica , ordene pelo 2@ coluna desc Compartilhar este post Link para o post Compartilhar em outros sites
Wajabed 0 Denunciar post Postado Julho 31, 2015 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
Motta 645 Denunciar post Postado Julho 31, 2015 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
Wajabed 0 Denunciar post Postado Julho 31, 2015 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
Motta 645 Denunciar post Postado Julho 31, 2015 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
Wajabed 0 Denunciar post Postado Julho 31, 2015 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
Motta 645 Denunciar post Postado Julho 31, 2015 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
Wajabed 0 Denunciar post Postado Julho 31, 2015 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
Wajabed 0 Denunciar post Postado Agosto 14, 2015 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
Wajabed 0 Denunciar post Postado Agosto 14, 2015 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