Clipper On Line • Ver Tópico - Ajuda com comandos SQL
Página 1 de 2

Ajuda com comandos SQL

MensagemEnviado: 01 Out 2018 10:42
por Poka
Olá a todos.

o comando abaixo dá erro unknow p
peguei aqui mesmo esse comando
 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?
  str:="select protocolo ,count(protocolo) from notad  group by protocolo having count(protocolo) > 1   ;"  


Obrigado
Poka

Ajuda com comandos SQL

MensagemEnviado: 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

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

harbour + Firebird 2.5 com ODBC

Poka

Ajuda com comandos SQL

MensagemEnviado: 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

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


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


Poka

Ajuda com comandos SQL

MensagemEnviado: 01 Out 2018 18:28
por alxsts
Olá!

Se podem exixtir várias linhas com docum e protocolo repetidos, coloque as duas condições:
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

MensagemEnviado: 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

MensagemEnviado: 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.

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
    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

    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.

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


Obrigado

Poka

Ajuda com comandos SQL

MensagemEnviado: 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

MensagemEnviado: 07 Jan 2019 09: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

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
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

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

Ajuda com comandos SQL

MensagemEnviado: 07 Jan 2019 19: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.

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

MensagemEnviado: 21 Jan 2019 20: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

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

codfor

Poka

Ajuda com comandos SQL

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

MensagemEnviado: 08 Fev 2019 12: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.

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

Ajuda com comandos SQL

MensagemEnviado: 08 Fev 2019 17:43
por JoséQuintas
to achando esse comando meio esquisito, na parte de filtros

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;

Ajuda com comandos SQL

MensagemEnviado: 18 Abr 2019 14:02
por Poka
Boa tarde.

Quintas, obrigado por responder , esses comandos estou usando o JOIN que seria o mais correto.
Mas estou enroscado numa situação agora com o JOIN. Será que vc ou alguem teria uma ajuda?
É o seguinte:

Nas minhas rotinas de browse chamo somente os registros de 20 em 20 mesmo em um arquivo de muitos registros.
campoOrdem vem de uma variavel

No ex abaixo, a coluna 4 deixo em branco '', depois a cada chamada tenho uma rotina a parte e gravo o nome do municipio pegando de CADMUN, funciona rapido , perfeito

//                 1          2           3            4 nomemun          5               
xcampos:="tab_uso.codigo, tab_uso.nome,tab_uso.fantasia,   ''       , tab_uso.codmun"
Str:="SELECT first "+str(browse_qtreg,2)+" skip("+str(browse_qtPula,5)+") "+xcampos+ " from cadfor tab_uso  ;"


No ex abaixo, a coluna 4 deixo nomemnun (nome do municiopio que vem de cadmun) e utilizo join para pegar o nome do municipi de cadmun , muito lerdo

//                1                2              3              4                   5        
//xcampos:="tab_uso.codigo, tab_uso.nome,tab_uso.fantasia, m.nomemun  , tab_uso.codmun"
Str:="SELECT first "+str(browse_qtreg,2)+" skip("+str(browse_qtPula,5)+") "+xcampos+ " from cadfor tab_uso  ";
+" LEFT JOIN cadMun m on m.codmun  = tab_uso.codmun ;"


Gostaria de usar o JOIN. dá a impressao que com o JOIN percorre todos os registros, talvez precise de outro select. Alguma idéia do que seja ?

Obrigado

Poka

Ajuda com comandos SQL

MensagemEnviado: 18 Abr 2019 14:03
por Poka
corrigindo, campoOrdem não existe aí.

Poka

Ajuda com comandos SQL

MensagemEnviado: 19 Abr 2019 18:58
por Poka
Resolvido

Poka

Ajuda com comandos SQL

MensagemEnviado: 07 Ago 2019 20:52
por Poka
Olá a todos.

Precisava pegar o codigo interno da tabela firebird

retorna um caracter estranho

"SELECT RDB$DB_KEY FROM dadopro;"

Alguem poderia dar uma ajuda?

Obrigado

Poka

Ajuda com comandos SQL

MensagemEnviado: 09 Ago 2019 18:38
por Poka
Hazael uso harbou , firebird com ODBC.
Antes de escolher FB li bastante sobre FB, MYSQL PostgreSQL. Entre os prós e contras gostei mais do FB por ser um arquivo único e vamos dizer assim mais portável.
Quanto ao odbc não vejo dificuldade nenhuma. No servidor instala o FB e o ODBC. e nos terminais so ODBC. Tenho um cliente que tem Windows SERVER vou testar lá mas acho que não precisa nem instalar nos terminais. Coloca ODBC e o FB e instala do seu próprio sistema mesmo. Não consegui usar nativo do harbour. Já fiz todas as funções que preciso, relatorios etc. Nem pensar em DBF mais. Quando surge duvidas procuro na internet, pegunto aqui e assim vai. Comprei um livro na época imprimi alguma apostilas. E o que mais gostei tambem é o arquivo único. Não aguentava mais ver aquele monte de dbf e cdx.

Poka