Ajuda com comandos SQL

Forum sobre SQL.

Moderador: Moderadores

Avatar do usuário
Poka
Usuário Nível 4
Usuário Nível 4
Mensagens: 563
Registrado em: 25 Out 2004 21:26
Localização: Leme/SP

Ajuda com comandos SQL

Mensagem por Poka »

Olá a todos.

o comando abaixo dá erro unknow p
peguei aqui mesmo esse comando

Código: Selecionar todos

 str:="select protocolo, count(protocolo) as p from notad group by protocolo  having p > 1;"    
este dá certo, não fica meio redundante?
dois count?

Código: Selecionar todos

  str:="select protocolo ,count(protocolo) from notad  group by protocolo having count(protocolo) > 1   ;"  


Obrigado
Poka
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Ajuda com comandos SQL

Mensagem por alxsts »

Olá!

Esta consulta seve para selecionar linhas de uma tabela que tenham mais de uma ocorrência do valor de alguma coluna.

Qual SGBDR você está utilizando? Pode ser que nele isto não seja aceito. Pode usar a segunda opção. Não é redundante não...
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
Poka
Usuário Nível 4
Usuário Nível 4
Mensagens: 563
Registrado em: 25 Out 2004 21:26
Localização: Leme/SP

Ajuda com comandos SQL

Mensagem por Poka »

Obrigado Alexandre por responder

harbour + Firebird 2.5 com ODBC

Poka
Avatar do usuário
Poka
Usuário Nível 4
Usuário Nível 4
Mensagens: 563
Registrado em: 25 Out 2004 21:26
Localização: Leme/SP

Ajuda com comandos SQL

Mensagem por Poka »

Alexandre
desculpa aproveitar da sua boa vontade
Antes de perguntar sempre verifico exemplos de livros , apostilas, mas os exemplos são só com um campo ( eles colocam só o mais fácil).

Retorna os repetidos

Código: Selecionar todos

    str:="select protocolo ,count(protocolo) from notad  group by protocolo having count(protocolo) > 1   ;"
retorna que não tem repetido

Código: Selecionar todos

    str:="select docum,protocolo, count(protocolo) from notad group by docum,protocolo  having count(protocolo) > 1 ;"  
Poka
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Ajuda com comandos SQL

Mensagem por alxsts »

Olá!

Se podem exixtir várias linhas com docum e protocolo repetidos, coloque as duas condições:

Código: Selecionar todos

str := "SELECT docum, protocolo, Count(docum), Count(protocolo) " + ;
         "FROM notad " + ;
     "GROUP BY docum, protocolo " + ;
       "HAVING ( Count(docum) > 1 AND Count(protocolo) ) > 1 ;" 
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Ajuda com comandos SQL

Mensagem por JoséQuintas »

Não sei se no firebird é diferente, mas....


SELECT protocolo, COUNT(*) AS qtd FROM notad GROUP BY protocolo HAVING qtd > 1
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
Poka
Usuário Nível 4
Usuário Nível 4
Mensagens: 563
Registrado em: 25 Out 2004 21:26
Localização: Leme/SP

Ajuda com comandos SQL

Mensagem por Poka »

Boa tarde

Alexandre

assim não retorna nada, mas ta correto
exemplos sao documentos diferentes com protocolos iguais, não é pra ter mesmo.

Código: Selecionar todos

str := "SELECT docum, protocolo, Count(docum), Count(protocolo) " + ;
	       "FROM notad " + ;
	       "GROUP BY docum, protocolo " + ;
	       "HAVING ( Count(docum) > 1 AND Count(protocolo) ) > 1 ;"
assim retorna correto

Código: Selecionar todos

    str := "SELECT  protocolo, Count(protocolo) " + ;
	         "FROM notad " + ;
	         "GROUP BY protocolo " + ;
	         "HAVING Count(protocolo)  > 1 ;"
mas quero aproveitar e trazer outros campos, docum por exemplo
nao retorna nada , mas era pra retornar

Código: Selecionar todos

    str := "SELECT docum,protocolo, Count(protocolo) " + ;
	         "FROM notad " + ;
	         "GROUP BY  docum,protocolo " + ;
	         "HAVING Count(protocolo)  > 1 ;"
já resolvi o problema, mas queria saber fazer isto, sei que na hora de extrair os relatorios posso precisar uma consulta deste tipo.



José Quintas
dá erro que a coluna QTD não existe.

Código: Selecionar todos

    str:="SELECT protocolo, COUNT(*) AS qtd FROM notad GROUP BY protocolo HAVING qtd > 1;"

Obrigado

Poka
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Ajuda com comandos SQL

Mensagem por alxsts »

Olá!

Vou instalar o Firebird para testar. Tem como anexar o script de criação da tabela e alguns inserts com dados de teste? Assim fica mais fácil...
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
Poka
Usuário Nível 4
Usuário Nível 4
Mensagens: 563
Registrado em: 25 Out 2004 21:26
Localização: Leme/SP

Ajuda com comandos SQL

Mensagem por Poka »

Olá a todos

as duvidas acima foram resolvidos. agradeço a ajuda de todos.

outra dúvida

exemplo de ficha de controle abaixo

Código: Selecionar todos

data  		historico	 valor	dc	saldo
03/04/2003	abertura   	0	c	0
30/04/2003	vales mes	 24,60	c	24,60
30/04/2003	vales mes	 24,60	c	49,20
30/04/2003	vales mes	 24,60	c	73,80
30/04/2003	vales mes	 24,60	c	98,40
07/05/2003	pagto    	 24,60	d	73,80
se quero o saldo de 07/05/2003 ok
saldo de 30/04/2003 ok
saldo de 05/05/2003 teria que trazer o ultimo saldo de 30/04/2003 98,40 está trazendo o primeiro de 30/04/2003 24,60.
quando tem + de um lançamento na data anteror, quando não existe a data pedida retorna errado.


comando

Código: Selecionar todos

select first 1 max(data) ,saldo from  movfor  where codfor  = '00856'  and data < '05/05/2003' group by data,saldo  order by data desc;


alguma ideia?

agradeço qq ajuda

Poka
Avatar do usuário
Poka
Usuário Nível 4
Usuário Nível 4
Mensagens: 563
Registrado em: 25 Out 2004 21:26
Localização: Leme/SP

Ajuda com comandos SQL

Mensagem por Poka »

Cheguei numa solução aqui. Resolvido.
Poka
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Ajuda com comandos SQL

Mensagem por JoséQuintas »

Tá se referindo a apenas um lançamento?
Uma coisa interessante em MySQL é ter sempre uma identificação única.
Teoricamente, o lançamento de ID mais recente seria o último.

Código: Selecionar todos

SELECT FIRST 1 DATA, SALDO FROM MOVFOR WHERE CODFOR='00856' AND DATA < '2003/05/05' ORDER BY DATA DESC, ID DESC
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
Poka
Usuário Nível 4
Usuário Nível 4
Mensagens: 563
Registrado em: 25 Out 2004 21:26
Localização: Leme/SP

Ajuda com comandos SQL

Mensagem por Poka »

Olá

Quintas escreveu
Uma coisa interessante em MySQL é ter sempre uma identificação única.
em itens de nota fiscal coloco nr do item , seria +- isso que vc ta dizendo Quintas?
A hora que chegar em cálculo de fichas de estoque, volto ao assunto

Agora estou precisando de outra ajuda meio complicado parece, mas acho que uma linha select resolve, creio que tenho que usar count e having mas não consegui.
Já tenho essa rotina funcionando em dbf normal, há muitos anos.
a lista de produto desse cliente não passa de 7 itens
Esse cliente coleta produtos de muitos fornecedores

de alguns fornecedores eles coletam somente 1 produto, outros 2 , outros 4 , tem muitos fornecedores, e cada fornecedor varios lancamentos no mes
no arquivo exemplo LANCA_2018 tenho
codprod
data
preciso saber no mes 07/2018 qual a maior quantidade de codigo coletados de um mesmo fornecedor, não é a quantidade de produtos.
não importa qual fornecedor. preciso saber para definir a largura do relatorios
Em um relatorio de 800 fornecedores se 799 pegou um tipo de codigo e 1 fornecedor pegou 5 tipos de codigo, vou considerar o maior.

Não sei se consegui explicar direito, agradeço qq ajuda

Grato
Poka
Avatar do usuário
Poka
Usuário Nível 4
Usuário Nível 4
Mensagens: 563
Registrado em: 25 Out 2004 21:26
Localização: Leme/SP

Ajuda com comandos SQL

Mensagem por Poka »

pra poder extrair essa informação faltou um campo do arquivo
codigo do fornecedor

codfor

Poka
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Ajuda com comandos SQL

Mensagem por JoséQuintas »

Poka escreveu:em itens de nota fiscal coloco nr do item , seria +- isso que vc ta dizendo Quintas?
Seria um número sequencial, quase como se fosse o RecNo().
No MySQL isso evita muita lentidão, é uma forma única de identificar um registro.

Um colega nosso aqui do fórum estava com uma base de 100GB.
Apagar um registro era uma eternidade, chegava a estourar o limite de tempo, e com chave única passou a ser mais instantâneo.
E a chave nem era importante pra pesquisa....
Foi aí que vi que faz muuuito mais diferença do que eu pensava.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
Poka
Usuário Nível 4
Usuário Nível 4
Mensagens: 563
Registrado em: 25 Out 2004 21:26
Localização: Leme/SP

Ajuda com comandos SQL

Mensagem por Poka »

Olá a todos.

Olhando a instrução abaixo, daria pra saber porque o comando SUM está trazendo duplicado, já vi na tabela, a quantidade ta certa.

Código: Selecionar todos

select  c.codmun, c.carrega, c.data , sum(c.pesobal) ,sum(c.totkilos), ca.placa,  m.nomemun   , mo.nome  from  Lan_2018 c  , carrega ca , motori mo  , cadmun m  where c.data >= '2018-07-01' and c.data <= '2018-07-31'  and  c.codmun >= '0062' and c.codmun <= '0062'  and  c.carrega = ca.codigo  and  ca.codmoto = mo.codigo  and  ca.codmun = m.codmun  group by c.codmun, c.carrega ,c.data, ca.placa,  m.nomemun, mo.nome;
Obrigado

Poka
Responder