Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Lady01

Consulta de percentual dentro de determinado período de tempo

Recommended Posts

Estou tentando criar uma consulta que me retorne o percentual semestral de produtos trocados,apresentando defeito, dada uma data. Estou conseguindo o percentual, mas não dentro do período de 6 meses, e sim de todas as datas cadastradas. Segue o código:

 

SELECT (COUNT( id ) / t.total) *100 AS percentual, comDefeito

FROM TROCA
JOIN

(SELECT COUNT( * ) AS total

FROM TROCA

) AS t
WHERE DATE_ADD( '2013/12/25', INTERVAL -180
DAY )
GROUP BY comDefeito

 

Alguém pode dar uma luz?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Motta,

Segui a sua orientação, mas ele continua considerando todas as datas =/

Ficou assim:

SELECT (COUNT( id ) / t.total) *100 AS percentual, comDefeito

FROM TROCA
JOIN

(SELECT COUNT( * ) AS total

FROM TROCA
WHERE DATE_ADD( '2013/12/25', INTERVAL -180 DAY )) AS t

GROUP BY comDefeito
LIMIT 0 , 30

Compartilhar este post


Link para o post
Compartilhar em outros sites

tenta assim ...

SELECT (COUNT( id ) / t.total) *100 AS percentual, comDefeito

FROM TROCA
JOIN 
(SELECT COUNT( * ) AS totalFROM TROCA

WHERE DATE_ADD( '2013/12/25', INTERVAL -180
DAY )
) AS t
WHERE DATE_ADD( '2013/12/25', INTERVAL -180
DAY ) 
GROUP BY comDefeito

Compartilhar este post


Link para o post
Compartilhar em outros sites

Motta,

Continua a mesma coisa, mas eu fiz um teste, dessa vez, puxando todos os registros de acordo com a condição da data e vi que não está obedecendo essa condição, traz todas as datas, veja como eu fiz:

SELECT *
FROM troca
WHERE DATE_ADD( '2013/12/22', INTERVAL -180
DAY )

 

Você conhece outro jeito de montar essa condição de data?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não conheço esta functions de data do MySql, presumi que a sua estava correta , apenas faltando na subquery.

 

em vez de

 

DATE_ADD( '2013/12/25', INTERVAL -180
DAY )

 

 

não seria

 


ADDDATE(campo_data, INTERVAL 180 DAY) <= curdate()

 

 

onde campo_data é a campo que tem a data de sua tabela ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Motta,

Usando assim dá erro de sintaxe. Acredito que eu não possa usar o campo data diretamente no mysql, pois eu vou pegar a data para consulta semestral através do formulário.

Tô fazendo vários testes aqui e nada

Compartilhar este post


Link para o post
Compartilhar em outros sites

WHERE DATE_ADD( '2013/12/25', INTERVAL -180 DAY )

 

não sei se entendi bem, mas só lembrando:

1: o formato de data no MySQL seria 2013-12-25

(com traços, não barras);

2. se queremos adicionar dias a uma determinada data, pode-se usar tanto adddate() como date_add() (são sinônimos), assim não faz muito sentido o sinal de menos antes da quantidade de dias;

3. se queremos subtrair uma quantidade de dias a partir de uma determinada data, podemos usar date_sub;

o exemplo abaixo exibe uma data 30 dias antes de 1 registro (uma noticia) inserida em 17/12/2013, às 16:09:19 (a coluna é "dia"):

DATE_sub(dia, INTERVAL 30 DAY) from tbnoticias where idnotic=17

resultado: 2013-11-17 16:09:19

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fernando,

Tentei adaptar suas orientações a minha realidade, continua trazendo todos os registros, veja:

SELECT data
FROM troca
WHERE DATE_SUB( '2013-12-25', INTERVAL 180
DAY )
LIMIT 0 , 30

Compartilhar este post


Link para o post
Compartilhar em outros sites

a minha realidade

 

olá.. veja bem, como eu disse, não sei se entedi bem, mas se não me engano,

sua consulta recupera uma data especifica, e me parece que não é isso o q vc precisa..

(alias não é por nada não, mas eu pessoalmente prefiro evitar o uso da palavra "data" já que em ingles pode ser uma palavra reservada que corresponde a "dados")

num intervalo muito específico, preciso (exatamente 180 dias)...

então um registro fora dessa data não atende à consulta, percebe?

uma sugestão: se vc quer recuperar uma faixa (vários registros)

dentro de uma sequencia de tempo, tente usar between..

ou então diferença entre datas.. (datediff)

adaptando o exemplo que passei acima, a seguinte consulta recupera todos os registros que tem até 60 dias:

select * from tbnoticias
where datediff(curdate(), dia) <= 60

Compartilhar este post


Link para o post
Compartilhar em outros sites

complementando.. a consulta abaixo recupera noticias inseridas num período de um ano (365 dias)
pelo autor "Fernando":

select * from tbnoticias
where datediff(curdate(), dia) <= 365 and autor='Fernando'

veja se é por ai.. e caso eu n esteja explicando bem ou n seria nada disso foi mal, ta?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal, consegui resolver, depois de muito brigar rs

Acontece que eu nunca tinha usado essas funções antes, e acabei fazendo a condição do where de forma errada, pois o ideal é usar between mesmo como o Fernando tinha falado.

O resultado final ficou assim:

 

SELECT (COUNT( id ) / t.total) *100 AS percentual, comDefeito
FROM TROCA
JOIN
(SELECT COUNT( * ) AS total
FROM TROCA
WHERE dataTroca
BETWEEN DATE_SUB( '2013-12-27', INTERVAL 186
DAY )
AND '2013-12-27'
) AS t
WHERE dataTroca
BETWEEN DATE_SUB( '2013-12-27', INTERVAL 186 DAY )
AND '2013-12-27'
GROUP BY comDefeito
Eu mudei o nome do campo data, devido a orientação do Fernando, por "data" ser uma palavra reservada. E coloquei o intervalo como 186 dias, considerando meses com 31 dias. Eu fiz as contas do percentual na mão também, para me certificar de que está tudo certo.
Agradeço ao Motta e ao Fernando pela atenção.
Até a próxima.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.