MySql, ajuda com comando SELECT
Moderador: Moderadores
MySql, ajuda com comando SELECT
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.
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.
fui...
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
MySql, ajuda com comando SELECT
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é+
SELECT codprd, max(datmov), sldstk FROM a04mov WHERE codprd=4094 AND is_deleted = 'N' AND datmov<=20131231 ORDER BY datmov DESC LIMIT 1
Até+
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
MySql, ajuda com comando SELECT
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)
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)
fui...
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
MySql, ajuda com comando SELECT
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é+
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é+
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
MySql, ajuda com comando SELECT
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?
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?
fui...
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
MySql, ajuda com comando SELECT
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: order by datmov desc limit 1
É isso ai, tentando... testando... uma hora vai!janio escreveu:Consegui ao resultado q eu queria
Boa sorte!
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
MySql, ajuda com comando SELECT
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...
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...
fui...
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
-
alxsts
- Colaborador

- Mensagens: 3092
- Registrado em: 12 Ago 2008 15:50
- Localização: São Paulo-SP-Brasil
MySql, ajuda com comando SELECT
Olá!
Não tenho os dados para testar a consulta mas, creio que funcionará. Por favor, teste e retorne.
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)[]´s
Alexandre Santos (AlxSts)
Alexandre Santos (AlxSts)
MySql, ajuda com comando SELECT
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??
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??
fui...
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
-
alxsts
- Colaborador

- Mensagens: 3092
- Registrado em: 12 Ago 2008 15:50
- Localização: São Paulo-SP-Brasil
MySql, ajuda com comando SELECT
Construí esta consulta baseada no que você colocou no teu código, se referindo a um produto específico.janio escreveu:Como seria pra retornar a ULTIMA ocorrência de CADA produto em que a data do movimento seja <= 20131231??
Para retornar todos os produtos, basta remover da cláusula WHERE esta condição
Código: Selecionar todos
WHERE codprd=4094Có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[]´s
Alexandre Santos (AlxSts)
Alexandre Santos (AlxSts)
MySql, ajuda com comando SELECT
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!
Se não especificar um produto ele passa a mostrar todos os produtos q tem lançamentos com data 31.12.2013!
fui...
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
-
alxsts
- Colaborador

- Mensagens: 3092
- Registrado em: 12 Ago 2008 15:50
- Localização: São Paulo-SP-Brasil
MySql, ajuda com comando SELECT
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.
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.
[]´s
Alexandre Santos (AlxSts)
Alexandre Santos (AlxSts)
MySql, ajuda com comando SELECT
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....
#-)
Mim custa crer....
#-)
fui...
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
-
alxsts
- Colaborador

- Mensagens: 3092
- Registrado em: 12 Ago 2008 15:50
- Localização: São Paulo-SP-Brasil
MySql, ajuda com comando SELECT
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.
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.
[]´s
Alexandre Santos (AlxSts)
Alexandre Santos (AlxSts)
MySql, ajuda com comando SELECT
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...
:|
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...
:|
fui...
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
