Ir para conteúdo
Fórum Script Brasil

fulvio

Moderadores
  • Total de itens

    1.218
  • Registro em

  • Última visita

Tudo que fulvio postou

  1. Bom dia Alex, Isto ocorre por causa de parametrização. O SQL tenta preservar os dados contidos em sua tabela. Vá em Ferramentas do Management Studio, Opções, abra Designers e clique em "Designers de Tabela e Banco de Dados" e desmarque a caixa de seleção "Evitar salvar alterações que exijam recriação de tabela".
  2. fulvio

    Insert

    Bom dia Alex, A formato da data vai depender da configuração da sua Base de Dados. Tem como ser de vários formatos. Mas caso queira um formato específico, pode-se utilizar a sintaxe CAST e CONVERT. No link há uma tabela de convert´s com seus respectivos formatos. http://msdn.microsoft.com/pt-br/library/ms187928.aspx Só tomar cuidado: a data 01/12/2010 é 1 de dezembro ou 12 de janeiro? você pode passar uma data e o banco a interpretar diferente. :.) Caso seja a "data_Emissao_Certificado_Aluno" seja o dia corrente, pode-se utilizar a sintaxe getdate(). Caso passe data, a mesma deve estar entre aspas simples.
  3. Bom dia Micheli, A estrutura do 1º select que montou está errada. Perceba que você referencia a tabela "ORCAMENTOS" no primeiro select, e eu retirei o join com esta tabela, onde eu o referencio no subselect. Pegue o 1º select que passei e compare com o que postou logo acima. A diferença entre os dois é exatamente isto que explicou: - o 1º teria que retornar a quantidade de serviços, independente da quantidade de itens. - o 2º teria que retornar a quantidade de serviços, proporcional a quantidade de itens. Para fazer o teste rode o script: -- Criação create table #Servicos (servico int, codigo int) create table #itensorcamento (grupo int, codigoref int) create table #orcamentos (numero int) -- Inserção de dados insert into #Servicos (servico, codigo) values (1,100) insert into #itensorcamento (grupo, codigoref) values (100,500) insert into #orcamentos (numero) values (500) insert into #itensorcamento (grupo, codigoref) values (100,600) insert into #itensorcamento (grupo, codigoref) values (100,700) insert into #orcamentos (numero) values (600) insert into #orcamentos (numero) values (700) -- select que retorna a quantidade de serviços select s.servico, s.codigo from #servicos s, #itensorcamento i where s.codigo = i.grupo and i.codigoref = (select top 1 it.codigoref from #orcamentos orc, #itensorcamento it where orc.numero = it.codigoref and it.grupo=s.codigo) order by servico -- select que retorna a quantidade de serviços, proporcional aos itens select s.servico, s.codigo from #servicos s, #itensorcamento i where s.codigo = i.grupo and i.codigoref in (select it.codigoref from #orcamentos orc, #itensorcamento it where orc.numero = it.codigoref and it.grupo=s.codigo) order by servico
  4. Boa tarde Diego, Com este script você consegue verificar se os nomes estão iguais também. Ao invés de agrupar por codigo, agrupe por "NOME CURSO". Ficaria assim: SELECT * FROM PESFISICA.P, SERVIDOR.S, CURSOPFEXT.C WHERE PESFISICA.P.COD.P=SERVIDOR.S.COD.P and SITUACAO = 1 and PESFISICA.P.COD.P = CURSOPFEXT.C.CODPESFIS and CURSOPFEXT.C.NOMECURSO in (select NOMECURSO from CURSOPFEXT.C group by NOMECURSO having count (NOMECURSO)>1) Caso queria acrescentar as datas Inicial e Final, também pode colocar no script. Ficaria assim: SELECT * FROM PESFISICA.P, SERVIDOR.S, CURSOPFEXT.C WHERE PESFISICA.P.COD.P=SERVIDOR.S.COD.P and SITUACAO = 1 and PESFISICA.P.COD.P = CURSOPFEXT.C.CODPESFIS and CURSOPFEXT.C.NOMECURSO in (select NOMECURSO from CURSOPFEXT.C group by NOMECURSO, ColoqueDataInicial, ColoqueDataFinal having count (NOMECURSO)>1) OBS: o group by com a data inicial e final só vai funcionar se elas forem iguais. Como está fazendo um levantamento, seria interessante identificar se há interceção entre as datas com descritivos iguais. Aí é outros 500 rs... Se tiver alguma dúvida, pode postar...
  5. Boa tarde Diego, Dê uma olhada no script... mas antes uma pergunta: cadê o "alias"? rs... SELECT * FROM PESFISICA.P, SERVIDOR.S, CURSOPFEXT.C WHERE PESFISICA.P.COD.P=SERVIDOR.S.COD.P and SITUACAO = 1 and PESFISICA.P.COD.P = CURSOPFEXT.C.CODPESFIS and CURSOPFEXT.C.CODCURSO in (select CODCURSO from CURSOPFEXT.C group by CODCURSO having count (CODCURSO)>1)
  6. Rs... não sei se entendi direito, mas vamos lá: Criei umas temporárias para tentar simular as referências entre as tabelas e seus códigos: -- Criação create table #Servicos (servico int, codigo int) create table #itensorcamento (grupo int, codigoref int) create table #orcamentos (numero int) -- Inserção insert into #Servicos (servico, codigo) values (1,100) insert into #itensorcamento (grupo, codigoref) values (100,500) insert into #orcamentos (numero) values (500) insert into #itensorcamento (grupo, codigoref) values (100,600) insert into #itensorcamento (grupo, codigoref) values (100,700) insert into #orcamentos (numero) values (600) insert into #orcamentos (numero) values (700) Ai tentei fazer o script de modo que retorne todos os campos e apenas 1, de acordo com o "Servicos". Retirei o group by. Roda os dois scripts e olha se é isso que deseja: select s.servico, s.codigo from servicos s, itensorcamento i where s.codigo = i.grupo and i.codigoref = (select top 1 it.codigoref from orcamentos orc, itensorcamento it where orc.numero = it.codigoref and it.grupo=s.codigo) order by servico select s.servico, s.codigo from servicos s, itensorcamento i where s.codigo = i.grupo and i.codigoref in (select it.codigoref from orcamentos orc, itensorcamento it where orc.numero = it.codigoref and it.grupo=s.codigo) order by servico
  7. Boa tarde Micheli, Uma dúvida: o seu resultado não deveria aparecer assim não? servico codigo primeiro emplacamento 1 renovaçao licenca 9 Pois desta forma, se você colocar a soma em uma terceira coluna, ela será duplicada. Ficaria assim: servico codigo SOMA primeiro emplacamento 1 3 primeiro emplacamento 1 3 primeiro emplacamento 1 3 renovaçao licenca 9 1 Vi que no group by possui a coluna numero (os.numero). Esta coluna é realmente necessária? Deve ser por isso que as linhas (primeiro emplacamento) estão duplicadas. Bem, caso queira contar os serviços, tente fazer desta forma: select (s.servico), s.codigo, count(s.servico) as Soma from servicos s, itensorcamento i, orcamentos os where s.codigo = i.grupo and os.numero = i.codigoref and cast(floor(cast(data as float)) as datetime) between '2010-03-03' and '2010-03-04' group by s.servico, s.codigo, os.numero order by servico
  8. Obrigado a todos!! Fico feliz em poder ajudar e fazer parte desta Equipe!! Obrigado pela oportunidade e pelo voto de confiança!!
  9. Boa tarde Diego, Este select retornará as pessoas e dados de servidores que possuem cursos. Só uma coisa: de acordo com as chaves KF que passou, o relacionamento está incorreto. Não deveria ser assim não? SELECT * FROM RH.T01000_PESFISICA INNER JOIN RH.T01001_SERVIDOR ON RH.T01000_PESFISICA.T01000_I_CDPESFIS = RH.T01001_SERVIDOR. T01000_I_CDPESFIS INNER JOIN RH.T01583_CURSOPFEXT ON RH.T01583_CURSOPFEXT.T01000_I_CDPESFIS = RH.T01000_PESFISICA.T01000_I_CDPESFIS WHERE T01001_I_STATUS = 1 and T01027_I_CDQUADRO = 7 Compare o script que postou e o que está em negrito. Se você quiser pegar as pessoas que não tenham cursos, pode fazer assim: SELECT * FROM RH.T01000_PESFISICA, RH.T01001_SERVIDOR WHERE RH.T01000_PESFISICA.T01000_I_CDPESFIS = RH.T01001_SERVIDOR.T01000_I_CDPESFIS and T01001_I_STATUS = 1 and T01027_I_CDQUADRO = 7 and RH.T01000_PESFISICA.T01000_I_CDPESFIS not in (select RH.T01583_CURSOPFEXT.T01000_I_CDPESFIS from RH.T01583_CURSOPFEXT) Uma dica: Quando for fazer o script referenciando mais de uma tabela, coloque "alias" (apelido) nelas. Ex.: SELECT * FROM PESFISICA P, .... where P.CODIGO=.... and P.NOME=...
  10. Tópico movido para Banco de Dados > Demais Bancos.
  11. fulvio

    LEFT OUTER JOIN

    Boa tarde Renan, Obrigado pelo elogio! Precisando estamos ai. Em relação ao seu problema, caso a regra de negócio obrigue, você poderá fazer a triangulação entre as 3 tabelas. Sempre digo que não existe errado ou certo, mas sim a melhor forma. A triangulação é uma forma!!! :.)
  12. fulvio

    INNER JOIN

    Boa tarde Danilo, Este script que passou é uma view? você terá que fazer esta pesquisa dentro desta view? você pode fazer um UNION para pegar as informações. Primeiro você faz o select pegando os dados que utiliza o contrato normal (flag=0). Depois você faz o select pegando os dados do contrato superior (flag=1). Os relacionamentos e as cláusulas podem ser diferentes. A única coisa que é OBRIGATÓRIA é a quantidade e sequência dos campos. Ex: Select A, B, C, D, E from ContratoNormal, XXXX where XXXXX and AAAA... UNION Select A, B, C, D, E from ContratoSuperior, YYYY where YYYY and BBBB... Caso tenha alguma dúvida, pode postar.
  13. Bom dia Diego. Precisando estamos ai! :.)
  14. Boa tarde Mauricio, O que você realiza na sua trigger? Qual a estrutura dela? você utiliza FOR INSERT, UPDATE... ou AFTER? As vezes você está tentando referenciar, no script, uma variável que já não existe mais (pois você a deletou). Aí você terá que ver o script da trigger. Se tiver alguma dúvida, posta a trigger ai. Outra coisa: é SQL SERVER ou MySQL?
  15. Bom dia Renato, Olha se este update ajuda: update TABELA set PRECODEVENDA=(select PREÇODECUSTO/COEFICIENTE*100 from TABELA) where (PREÇODECUSTO/COEFICIENTE*100) < valor
  16. fulvio

    LEFT OUTER JOIN

    Boa tarde Renan, No seu exemplo: Contatos é Mãe / Gerentes é Filho. Se você tiver a chave que liga a Empresa com o Gerente, você consegue. Caso não exista este relacionamento, não conseguirá mostrar os Gerentes. Esse negócio tá fincando meio complexo.. rs. Uma dúvida: dá pra ajuntar as tabelas Contatos e Gerentes? Aí você resolve este problema. você coloca os campos podendo inserir nulo. Coloca a FK da Empresa e fim.
  17. Boa tarde Diego. O script que te passei, seria uma verificação em massa. Vamos passo a passo, levando em consideração se fosse rodar na sua Base: - Criar a tabela temporária (no meu exemplo, #Nomes), ou fixa que posteriormente será deletada. - Dar carga nesta tabela, com os campos Nomes e IDPESSOA. - Rodar o script que te passei. - Dar o select nos campos da tabela criada, identificando os nomes e sobrenomes com mais de 10 caracteres. - Pegar os IDPESSOA que foram filtrados e utiliza-los na sua tabela, para listar as pessoas que estão com problemas. No seu caso, você rodaria este select aí que postou, selecionando apenas a coluna NOME e IDPESSOA, inserindo na temporária: insert into #Nomes (IDPESSOA, nome) SELECT NOME, IDPESSOA FROM RH.T01000_PESFISICA ...... Ai você roda o resto do script Na temporária, você terá os nomes todos divididos pelo espaço. Nela, você fará seu filtro. Pega os IDPESSOA nela e uitilize na sua Base Oficial. Outra coisa: se utilizar o BEGIN TRAN e der ROLLBACK, você irá desfazer tudo que vez. Qualquer dúvida, pode postar.
  18. fulvio

    LEFT OUTER JOIN

    Boa tarde Renan, Agora você terá q alterar o seu select. Execute os dois e veja o resultado: SELECT * FROM EMPRESA E LEFT OUTER JOIN CONTATO C ON E.EMP_ID = C.EMP_ID LEFT OUTER JOIN GERENTE G ON E.EMP_ID = G.EMP_ID AND G. GER_LINHA = C. CON_LINHA ORDER BY E.ID SELECT * FROM EMPRESA E LEFT OUTER JOIN GERENTE G ON E.EMP_ID = G.EMP_ID LEFT OUTER JOIN CONTATO C ON E.EMP_ID = C.EMP_ID AND G. GER_LINHA = C. CON_LINHA ORDER BY E.ID Perceba que o SQL é excludente!! Outra coisa: você não precisa criar uma coluna nas duas tabelas (Contato e Gerente). você terá que determinar quem é a mãe e o filho (de acordo com sua regra de negócio). - Contato --> Gerente Se for assim, pegue a chave (PK) da Contato, e coloque-a na Gerente (que será FK). - Gerente --> Contato Se for assim, pegue a chave (PK) da Gerente , e coloque-a na Contato (que será FK). Qualquer dúvida, pode postar. :.)
  19. Boa tarde Diego. O script que te passei não funcionou não? O script altera a tabela temporária. Toda vez q tem espaço, ele separa os nomes. Inclua sua chave na tabela temporária, dê o select e terá as colunas de sua tabela principal com as linhas pesquisadas.
  20. Boa tarde Diego. De nada. Precisando estamos ai!!! :.)
  21. fulvio

    LEFT OUTER JOIN

    Boa tarde Renan, Por nada. Quando resolver posta aí!!! :.)
  22. fulvio

    LEFT OUTER JOIN

    Boa tarde Renan, Ok. Estou perguntando isto pois as vezes não é o select, mas sim os relacionamentos que estão incorretos. Pelo que vi, a modelagem não está adequada. A Empresa se relaciona com o Gerente. A empresa se relaciona com o Contato (de acordo com a chave). A melhor forma de modelar seria: O Contato seria filho da tabela Gerente, e não da tabela Empresa (conforme seu caso, em que cada gerente tem seu contato). Caso o Contato seja filho da Empresa, o Gerente tem que ser filho do Contato. Ficaria assim, dependendo da sua regra de negócio: - Empresa --> Contato --> Gerente ou - Empresa --> Gerente --> Contato Na sua modelagem, a Empresa está com dois filhos. E foi esta a minha pergunta: com os dois filhos sem relacionamentos (Gerente e Contato), como saberei qual gerente está associado a qual contato? :.) Para este caso, não há como resolver com um simples select. Ou remodela ou coloca uma chave ligando os dois filhos (Gerente e Contato). Ai você fará uma triangulação entre as tabelas (funciona, mas a remodelagem é a melhor escolha).
  23. Boa tarde Diego, Executei o script aqui e deu tudo ok. A declaração da variável "@Contador" tem que ser executada junto com os While's. Ela existe apenas em tempo de execução. Por isso q deve estar dando erro pra vc. Seleciona ela também e manda executar. O campo "Controle" é auto-incremento. Foi utilizado apenas para controlar as manipulações. Qualquer dúvida, posta aí. :.)
  24. fulvio

    LEFT OUTER JOIN

    Bom dia Renan, Como, via sistema, você sabe que o "Contato 1" é do "Gerente 1" e assim por diante?
  25. Bom dia Diego, Ok, entendido. O problema da sintaxe patindex é que o SQL retorna a posição do 1º caracter (no seu caso espaço) que encontrar. Sendo assim, você não conseguirá verificar os próximos espaços, desta forma. Fiz o seguinte: criei uma tabela temporária, onde coloquei alguns nomes de teste. Fui gravando e quebrando os nomes de acordo com os espaços. Sendo assim, quando se encontra um espaço, divido. Depois conto quantos caracteres possui cada palavra do nome. Coloquei um campo PrimeiroNome mais 5 sobrenomes. Caso tenha nomes maiores na sua base, só aumentar as colunas. O WHILE fica do mesmo jeito. Caso queira mais sobrenomes, copia/cola e muda as variáveis. Coisa bem intuitiva, pois coloquei as variáveis na cronologia. Aí é só mudar o número. Dá uma olhada no exemplo que coloquei aí. Se tiver alguma dúvida, pode postar. Outra coisa: olha o exemplo de nome "Antonio de Souza Almeida". Se o "de" estiver junto do "Souza", não será identificado no filtro. -- criar tabela create table #Nomes (Controle int identity, IDPESSOA int, nome varchar(80), PrimeiroNome varchar(20), Sobrenome1 varchar(20), Sobrenome2 varchar(20), Sobrenome3 varchar(20), Sobrenome4 varchar(20), Sobrenome5 varchar(20)) -- inserção insert into #Nomes (IDPESSOA, nome) values (250, 'DIEGO SANTANA CRUZ') insert into #Nomes (IDPESSOA, nome) values (325, 'DIEGO SANTANACRUZ') insert into #Nomes (IDPESSOA, nome) values (856, 'Antonio FerreiraDuarte') insert into #Nomes (IDPESSOA, nome) values (268, 'Antonio Ferreira Duarte') insert into #Nomes (IDPESSOA, nome) values (2952, 'Antonio de Souza Almeida') insert into #Nomes (IDPESSOA, nome) values (268, 'Antonio de SouzaAlmeida') -- rodar tudo, daqui até o ** Declare @Contador int Set @Contador = 1 While @Contador < (select count(nome) from #Nomes) Begin update #nomes set Sobrenome1 = (select substring(nome, patindex('% %',nome)+1, len(nome)) from #Nomes where controle=@Contador) where controle=@Contador update #nomes set PrimeiroNome = (select substring(nome, 1, patindex('% %',nome)-1) from #Nomes where controle=@Contador) where controle=@Contador Set @Contador = @Contador + 1 End Set @Contador = 1 While @Contador < (select count(nome) from #Nomes) Begin update #nomes set Sobrenome2 = (select substring(Sobrenome1, patindex('% %',Sobrenome1)+1, len(Sobrenome1)) from #Nomes where controle=@Contador) where controle=@Contador update #nomes set Sobrenome1 = (select substring(Sobrenome1, 1, patindex('% %',Sobrenome1)-1) from #Nomes where controle=@Contador) where controle=@Contador update #Nomes set Sobrenome2= null where Sobrenome1=Sobrenome2 Set @Contador = @Contador + 1 End Set @Contador = 1 While @Contador < (select count(nome) from #Nomes) Begin update #nomes set Sobrenome3 = (select substring(Sobrenome2, patindex('% %',Sobrenome2)+1, len(Sobrenome2)) from #Nomes where controle=@Contador) where controle=@Contador update #nomes set Sobrenome2 = (select substring(Sobrenome2, 1, patindex('% %',Sobrenome2)-1) from #Nomes where controle=@Contador) where controle=@Contador update #Nomes set Sobrenome3= null where Sobrenome2=Sobrenome3 Set @Contador = @Contador + 1 End -- ** select * from #Nomes select * from #Nomes where len(PrimeiroNome)>10 or len(Sobrenome1)>10 or len(Sobrenome2)>10 or len(Sobrenome3)>10
×
×
  • Criar Novo...