Clipper On Line • Ver Tópico - MySql, ajuda com comando SELECT
Mudar para estilo Clássico
Discussão sobre SQL
Postar uma resposta

MySql, ajuda com comando SELECT

01 Set 2014 21:01

Olá a todos,

Preciso fazer uma consulta com mysql mas num tô saindo do lugar.

Quero pegar os valores de uns campos na ultima ocorrência de um produto dentro de um scopo, tipo:

SELECT codprd, max(datmov) FROM a04mov WHERE codprd=4094 AND is_deleted = 'N' AND datmov<=20131231 GROUP BY codprd

Ok, o select acima funciona e mim mostra o ultimo lançamento do produto em que a data seja menor ou igual a 31.12.2013.

Agora preciso pegar o valor do campo SLDSTK dessa consulta, como?? seria algo como um "select dentro de outro select"...

Em DBFCDX seria apenas:
Select Tabela
DbSetOrder(x)
DbGoTop()
OrdScope( 0, Ctod("01/01/1990") )
OrdScope( 1, Ctod("31/12/2013") )
DbGoTop()
DbGoBotton()

saldo = SLDSTK
Data = DATMOV

...

Mas, no mysql ja tentei

SELECT codprd, max(datmov), sldstk FROM a04mov WHERE codprd=4094 AND is_deleted = 'N' AND datmov<=20131231 GROUP BY codprd

mas num funciona! O valor de SLDSTK, nesse caso, não é o da ultima data do lançamento.

MySql, ajuda com comando SELECT

01 Set 2014 22:20

Jânio, sem ter como testar ficar "difícil", mais já tentou assim:

SELECT codprd, max(datmov), sldstk FROM a04mov WHERE codprd=4094 AND is_deleted = 'N' AND datmov<=20131231 ORDER BY datmov DESC LIMIT 1

Até+

MySql, ajuda com comando SELECT

02 Set 2014 07:17

Deu certo nao, Andril!

A query continua mim retornando apenas um registro com a data correta, no caso 15.06.2013, mas o conteudo do campo SLDSTK continua sendo o da PRIMEIRA ocorrência desse produto (lançamento com data<31.12.2013, ou seja, 12.05.2012).

A data vem correta, a ultima (max()), mas o campo, nao! Vem a primeira ocorrência.

O correto seria DATMOV retornar 15.06.2013 (como de fato esta retornando), e SLDSTK retornar 5! Mas SLDSTK está vindo eh 13 (primeira ocorrencia)
Anexos
cons.jpg

MySql, ajuda com comando SELECT

02 Set 2014 07:30

Jânio, tenta assim:

SELECT codprd, max(datmov) as datm, (SELECT sldstk FROM a04mov WHERE codprd=4094 && datmov=datm && AND is_deleted = 'N' AND datmov<=20131231 LIMIT 1) as sldstk1 FROM a04mov WHERE codprd=4094 AND is_deleted = 'N' AND datmov<=20131231 ORDER BY datmov DESC LIMIT 1

O correto era ter um ID (ÚNICO) deste registro para facilitar a pesquisa (select principal traria o ID do registro localizado, tornando-o único para buscar com outro select), vai tentando com este padrão acima na tentativa e erro.

SELECT ID as myID ,codprd, max(datmov) as datm, (SELECT sldstk FROM a04mov WHERE ID=myID LIMIT 1) as sldstk1 FROM a04mov WHERE codprd=4094 AND is_deleted = 'N' AND datmov<=20131231 ORDER BY datmov DESC LIMIT 1

Até+

MySql, ajuda com comando SELECT

02 Set 2014 07:44

Perae Pessoas!

Consegui ao resultado q eu queria assim:
SELECT max(datmov), (Select sldstk FROM a04mov where codprd=4094 order by datmov desc limit 1) as SALDO FROM a04mov WHERE codprd=4094 AND is_deleted = 'N' AND datmov<=20131231 group by codprd

Mas sera q eh dessa forma mesmo o jeito correto?
Anexos
consulta.jpg

MySql, ajuda com comando SELECT

02 Set 2014 07:59

janio escreveu: order by datmov desc limit 1

Ai ta te retornando a maior data possivel, não sendo limitada por datmov<=20131231 , tem que prestar atenção conforme for tendo mais registros para ver se o resultado permanece o mesmo.

janio escreveu:Consegui ao resultado q eu queria

É isso ai, tentando... testando... uma hora vai!

Boa sorte!

MySql, ajuda com comando SELECT

02 Set 2014 08:29

Andril,

Agora não tenho como, mas mais tarde vou testar o ultimo exemplo q vc postou. Realmente preciso ver se o max(datmov) esta sendo limitado por "where datmov<=20141231".

O problema de SUBquery eh q so pode retornar um campo. E se eu precisasse pegar o valor de mais de campo?? Como eu faria?? Tenho q ver essas coisas...

MySql, ajuda com comando SELECT

02 Set 2014 12:57

Olá!

Não tenho os dados para testar a consulta mas, creio que funcionará. Por favor, teste e retorne.
Código:
SELECT t1.codprd, t1.datmov
  FROM a04mov t1
WHERE codprd=4094
   AND t1.is_deleted = 'N'
   AND t1.datamov = (SELECT Max(datmov)
                       FROM a04mov
                      WHERE codprd = t1.codprod
                        AND datmov<=20131231)

MySql, ajuda com comando SELECT

02 Set 2014 14:41

Certinho, alxsts!

Seu codigo retorna a ultima ocorrência do produto q a data seja <= 31.12.2013. Dados corretos, inclusive da coluna SLDSTK.

Mas tem um porém...

Não funciona para pegar a ULTIMA ocorrência de TODOS OS PRODUTOS!

Como seria pra retornar a ULTIMA ocorrência de CADA produto em que a data do movimento seja <= 20131231??

MySql, ajuda com comando SELECT

02 Set 2014 16:35

janio escreveu:Como seria pra retornar a ULTIMA ocorrência de CADA produto em que a data do movimento seja <= 20131231??

Construí esta consulta baseada no que você colocou no teu código, se referindo a um produto específico.

Para retornar todos os produtos, basta remover da cláusula WHERE esta condição
Código:
WHERE codprd=4094
, ficando assim:
Código:
SELECT t1.codprd, t1.datmov
  FROM a04mov t1
WHERE t1.is_deleted = 'N'
   AND t1.datamov = (SELECT Max(datmov)
                       FROM a04mov
                      WHERE codprd = t1.codprod
                        AND datmov<=20131231)
ORDER BY t1.codprd
Neste exemplo, coloquei o ORDER BY por código. Ajuste à tua necessidade

MySql, ajuda com comando SELECT

02 Set 2014 17:18

Deu certo nao, AlxSts!

Se não especificar um produto ele passa a mostrar todos os produtos q tem lançamentos com data 31.12.2013!
Anexos
song.jpg

MySql, ajuda com comando SELECT

02 Set 2014 17:55

Olá!

Bom... aí você tem que verificar a regra de negócio a aplicar pois eu não conheço.

Se na tabela existem vários registros que satisfazem as condições, estes registros serão mesmo retornados. Pelo que vi, você tem vários registros na tabela, do mesmo produto e com a mesma data. Desta forma, se você precisa da última ocorrência de cada produto na data, não vai conseguir filtrar. Teria que ter mais um campo.

O ideal seria que este campo datmov fosse do tipo de dados datetime, o que geraria o resultado esperado através da execução da função Max(datmov) no SELECT.

MySql, ajuda com comando SELECT

02 Set 2014 19:02

Mim custa crer q não ha uma solução para um problema tao corriqueiro como esse em filtros de banco de dados. Quem nunca precisou de algo assim?? Em todos os foruns q olhei na internet com problema semelhante, nenhum foi até o final com uma solução...

Mim custa crer....
#-)

MySql, ajuda com comando SELECT

02 Set 2014 19:38

Olá!

Como encontrar a diferença entre coisas iguais? Impossível, não acha? Você teria o mesmo problema com DBF. Este é um problema típico de modelagem de dados.

Você não consegue alterar o tipo de dados do campo datmov para datetime? Se conseguisse, este campo guardaria a data e hora do lançamento. Dessa forma seria possível ordenar e pegar o último lançamento do dia.

Poste a estrutura completa da tua tabela. Talvez possamos encontrar um campo que sirva para o que precisamos.

MySql, ajuda com comando SELECT

02 Set 2014 20:18

Alexandre,

Minha tabela eh uma tabela simples q guarda os lançamentos (movimentações) dos produtos. A cada vez que o estoque do produto eh AUMENTADO ou DIMINUÍDO, faço um lançamento nessa tabela.

Alem da data do lançamento, saldo e codigo do produto, tenho o campo NUMMOV que eh NUMERICO e AUTOINCREMENT. Cada lançamento tem um NUMMOV diferente.

Logicamente, cada produto tem nnnn lançamentos nessa tabela. A DATA e o NÚMERO DO MOVIMENTO diferenciam os lançamentos de cada produto. Apenas preciso pegar o ULTIMO lançamento de CADA PRODUTO. Isso em DBF eh mamão com açucar. O unico problema, nesse caso, eh q em dbf eu teria q ir vendo produto a produto qual o ultimo lançamento. Ou seja, numa tabela de produtos com 20.000 itens, seria 20mil 'consultas' num laço 'For' ou 'do while'. Ja no MySql isso vem eh uma UNICA query (pelo menos era pra vir).

Nao acho esse 'problema' tao dificil assim, mas ja tô com minha cabeça doendo de tentar tanta coisa...
:|
Postar uma resposta