Clipper On Line • Ver Tópico - Ajuda com comandos SQL

Ajuda com comandos SQL

Discussão sobre SQL

Moderador: Moderadores

 

Ajuda com comandos SQL

Mensagempor Poka » 01 Out 2018 10:42

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
Avatar de usuário

Poka
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 509
Data de registro: 25 Out 2004 21:26
Cidade/Estado: Leme/SP
Curtiu: 0 vez
Mens.Curtidas: 23 vezes

Ajuda com comandos SQL

Mensagempor alxsts » 01 Out 2018 11:29

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)
alxsts
Colaborador

Colaborador
 
Mensagens: 2943
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 21 vezes
Mens.Curtidas: 248 vezes

Ajuda com comandos SQL

Mensagempor Poka » 01 Out 2018 15:24

Obrigado Alexandre por responder

harbour + Firebird 2.5 com ODBC

Poka
Avatar de usuário

Poka
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 509
Data de registro: 25 Out 2004 21:26
Cidade/Estado: Leme/SP
Curtiu: 0 vez
Mens.Curtidas: 23 vezes

Ajuda com comandos SQL

Mensagempor Poka » 01 Out 2018 16:42

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
Avatar de usuário

Poka
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 509
Data de registro: 25 Out 2004 21:26
Cidade/Estado: Leme/SP
Curtiu: 0 vez
Mens.Curtidas: 23 vezes

Ajuda com comandos SQL

Mensagempor alxsts » 01 Out 2018 18:28

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 ;"
[]´s
Alexandre Santos (AlxSts)
alxsts
Colaborador

Colaborador
 
Mensagens: 2943
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 21 vezes
Mens.Curtidas: 248 vezes

Ajuda com comandos SQL

Mensagempor JoséQuintas » 01 Out 2018 19:52

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, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18009
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Ajuda com comandos SQL

Mensagempor Poka » 04 Out 2018 16:27

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
Avatar de usuário

Poka
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 509
Data de registro: 25 Out 2004 21:26
Cidade/Estado: Leme/SP
Curtiu: 0 vez
Mens.Curtidas: 23 vezes

Ajuda com comandos SQL

Mensagempor alxsts » 04 Out 2018 17:04

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)
alxsts
Colaborador

Colaborador
 
Mensagens: 2943
Data de registro: 12 Ago 2008 15:50
Cidade/Estado: São Paulo-SP-Brasil
Curtiu: 21 vezes
Mens.Curtidas: 248 vezes

Ajuda com comandos SQL

Mensagempor Poka » 07 Jan 2019 09:40

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
Avatar de usuário

Poka
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 509
Data de registro: 25 Out 2004 21:26
Cidade/Estado: Leme/SP
Curtiu: 0 vez
Mens.Curtidas: 23 vezes

Ajuda com comandos SQL

Mensagempor Poka » 07 Jan 2019 12:10

Cheguei numa solução aqui. Resolvido.
Poka
Avatar de usuário

Poka
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 509
Data de registro: 25 Out 2004 21:26
Cidade/Estado: Leme/SP
Curtiu: 0 vez
Mens.Curtidas: 23 vezes

Ajuda com comandos SQL

Mensagempor JoséQuintas » 07 Jan 2019 19:49

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
José M. C. Quintas
Harbour 3.2, mingw, gtwvg, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18009
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Ajuda com comandos SQL

Mensagempor Poka » 21 Jan 2019 20:12

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 de usuário

Poka
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 509
Data de registro: 25 Out 2004 21:26
Cidade/Estado: Leme/SP
Curtiu: 0 vez
Mens.Curtidas: 23 vezes

Ajuda com comandos SQL

Mensagempor Poka » 21 Jan 2019 20:18

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

codfor

Poka
Avatar de usuário

Poka
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 509
Data de registro: 25 Out 2004 21:26
Cidade/Estado: Leme/SP
Curtiu: 0 vez
Mens.Curtidas: 23 vezes

Ajuda com comandos SQL

Mensagempor JoséQuintas » 21 Jan 2019 21:31

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, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18009
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Ajuda com comandos SQL

Mensagempor Poka » 08 Fev 2019 12:53

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
Avatar de usuário

Poka
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 509
Data de registro: 25 Out 2004 21:26
Cidade/Estado: Leme/SP
Curtiu: 0 vez
Mens.Curtidas: 23 vezes

Próximo



Retornar para SQL

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 14 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro