Página 1 de 2

Ajuda com comandos SQL

Enviado: 01 Out 2018 10:42
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

Ajuda com comandos SQL

Enviado: 01 Out 2018 11:29
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...

Ajuda com comandos SQL

Enviado: 01 Out 2018 15:24
por Poka
Obrigado Alexandre por responder

harbour + Firebird 2.5 com ODBC

Poka

Ajuda com comandos SQL

Enviado: 01 Out 2018 16:42
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

Ajuda com comandos SQL

Enviado: 01 Out 2018 18:28
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 ;" 

Ajuda com comandos SQL

Enviado: 01 Out 2018 19:52
por JoséQuintas
Não sei se no firebird é diferente, mas....


SELECT protocolo, COUNT(*) AS qtd FROM notad GROUP BY protocolo HAVING qtd > 1

Ajuda com comandos SQL

Enviado: 04 Out 2018 16:27
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

Ajuda com comandos SQL

Enviado: 04 Out 2018 17:04
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...

Ajuda com comandos SQL

Enviado: 07 Jan 2019 10:40
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

Ajuda com comandos SQL

Enviado: 07 Jan 2019 13:10
por Poka
Cheguei numa solução aqui. Resolvido.
Poka

Ajuda com comandos SQL

Enviado: 07 Jan 2019 20:49
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

Ajuda com comandos SQL

Enviado: 21 Jan 2019 21:12
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

Ajuda com comandos SQL

Enviado: 21 Jan 2019 21:18
por Poka
pra poder extrair essa informação faltou um campo do arquivo
codigo do fornecedor

codfor

Poka

Ajuda com comandos SQL

Enviado: 21 Jan 2019 22:31
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.

Ajuda com comandos SQL

Enviado: 08 Fev 2019 13:53
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