Página 1 de 2
MySql, ajuda com comando SELECT
Enviado: 01 Set 2014 21:01
por janio
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
Enviado: 01 Set 2014 22:20
por ANDRIL
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
Enviado: 02 Set 2014 07:17
por janio
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)
MySql, ajuda com comando SELECT
Enviado: 02 Set 2014 07:30
por ANDRIL
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
Enviado: 02 Set 2014 07:44
por janio
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?
MySql, ajuda com comando SELECT
Enviado: 02 Set 2014 07:59
por ANDRIL
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
Enviado: 02 Set 2014 08:29
por janio
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
Enviado: 02 Set 2014 12:57
por alxsts
Olá!
Não tenho os dados para testar a consulta mas, creio que funcionará. Por favor, teste e retorne.
Código: Selecionar todos
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
Enviado: 02 Set 2014 14:41
por janio
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
Enviado: 02 Set 2014 16:35
por alxsts
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
, ficando assim:
Código: Selecionar todos
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
Enviado: 02 Set 2014 17:18
por janio
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!
MySql, ajuda com comando SELECT
Enviado: 02 Set 2014 17:55
por alxsts
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
Enviado: 02 Set 2014 19:02
por janio
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
Enviado: 02 Set 2014 19:38
por alxsts
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
Enviado: 02 Set 2014 20:18
por janio
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...
:|