
fulvio
Moderadores-
Total de itens
1.218 -
Registro em
-
Última visita
Tudo que fulvio postou
-
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".
-
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.
-
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
-
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...
-
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)
-
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
-
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
-
Obrigado a todos!! Fico feliz em poder ajudar e fazer parte desta Equipe!! Obrigado pela oportunidade e pelo voto de confiança!!
-
(Resolvido) Problema com Consulta em 3 Tabelas
pergunta respondeu ao DiegoVix de fulvio em SQL Server
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=... -
Tópico movido para Banco de Dados > Demais Bancos.
-
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!!! :.)
-
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.
-
Bom dia Diego. Precisando estamos ai! :.)
-
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?
-
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
-
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.
-
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.
-
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. :.)
-
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.
-
Boa tarde Diego. De nada. Precisando estamos ai!!! :.)
-
Boa tarde Renan, Por nada. Quando resolver posta aí!!! :.)
-
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).
-
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í. :.)
-
Bom dia Renan, Como, via sistema, você sabe que o "Contato 1" é do "Gerente 1" e assim por diante?
-
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