Ir para conteúdo

POWERED BY:

Arquivado

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

CrazyLOL

usando IF

Recommended Posts

Galera, to com uma bronca aqui que acredito que seja simples.

 

Bom tenho uma tabela que fica salvo resumos de livros que foram enviados ( as pessoas digitam um resumo do livro e envia ) na tabela eu tenho 2 colunas que são data_envio que é o dia que foi feito o envio do resumo, e a coluna mes_referencia que é para qual mes aquele resumo foi enviado.

 

O que eu preciso agora, gerar um relatorio de todos os usuarios que enviaram resumo, comparando se a Data de envio é o mesmo que o mes referencia, se a condição for verdadeira o usuario ganha uma estrela se não ele ganha uma bolinha vermelha.

 

Dessa maneira eu montei este select:

select
a.`USUARIO`,
(IF((MONTH(a.`DATA_ENVIO`) = 1 and a.`MES_REFERENCIA` = 1),1,0)) AS 'JAN',
(IF((MONTH(a.`DATA_ENVIO`) = 2 and a.`MES_REFERENCIA` = 2),1,0)) AS 'FEV',
(IF((MONTH(a.`DATA_ENVIO`) = 3 and a.`MES_REFERENCIA` = 3),1,0)) AS 'MAR'
from rh_resumos a
group by a.`USUARIO`

 

Qual o erro? na tabela eu tenho 2 valores salvos sendo eles 1 resumo enviado no mes de Janeiro e um para Fevereiro, ambos resumos foram enviados no período certo, Porém quando eu executo este select ele traz apenas este resultado:

 

USUARIO | JAN | FEV | MAR

Teste | 0 | 1 | 0

 

O Correto seria:

 

USUARIO | JAN | FEV | MAR

Teste | 1 | 1 | 0

 

O que fiz de errado?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tira o group by pra ver o que acontece, no meu ver o correto seria:

 

USUARIO | JAN | FEV | MAR

Teste | 0 | 1 | 0

Teste | 1 | 0 | 0

 

Se você tirar o group by creio eu que retornaria desta forma acima e outra coisa seu if você pode deixar menor desta forma:

select
a.`USUARIO`,
(IF((MONTH(a.`DATA_ENVIO`) = a.`MES_REFERENCIA`),1,0)) AS 'JAN',
(IF((MONTH(a.`DATA_ENVIO`) = a.`MES_REFERENCIA`),1,0)) AS 'FEV',
(IF((MONTH(a.`DATA_ENVIO`) = a.`MES_REFERENCIA`),1,0)) AS 'MAR'
from rh_resumos a;

ai seu select ficaria da forma que está acima...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então Roberto este trecho que citie:

 

Data de envio é o mesmo que o mes referencia,

 

Coloquei de forma errada no caso eu preciso verificar se o mes da data_envio é 1 (janeiro) e se o mês_referencia é 1 também dessa maneira eu posso classificar ele 1 = estrela (enviou o resumo no periodo certo que é Janeiro) e 0 = (bolinha vermelha não enviou o resumo no periodo certo ou não enviou o resumo).

 

Tirando o Group By realmente funciona porém preciso usar o Group By porquue é muitos colaboradores e preciso criar o rank com estrelas e bolinhas vermelhas para quem enviou ou não os resumos.

 

Pelo que percebi ele só está pegando o ultimo valor da consulta quando utilizo o group by e não todos os valores que a tabela possui..

:(

Compartilhar este post


Link para o post
Compartilhar em outros sites

Motta nesse caso ele vai somar correto?

No meu problema eu não posso somar porque eu já defini no PHP que caso o "JAN" for 1 o cara foi estrela, ele enviou o resumo na data certo e se caso for 0 ele não enviou e fica com bolinha vermelha.

 

Se eu somar pode ter caso que o cara enviou 2 resumos no mes dessa maneira vai ficar JAN = 2

 

Eu fiz um outro teste aqui agora na primeira linha para ver se estava entra no bloco "se não" do if alterei o valor que está em destaque abaixo para 2 e o resultado foi assim.

 

(IF((MONTH(a.`DATA_ENVIO`) = 1 AND a.`MES_REFERENCIA` = 1),1,2)) AS 'JAN',

 

Usuario | JAN | FEV | MAR

Teste | 2 | 1 | 0

 

Ele de certa forma entrou na condição porém retornou que não existe dados para o mes, mas existe sim o dado para o mes.

Compartilhar este post


Link para o post
Compartilhar em outros sites

algo assim ...

select a.`USUARIO`,
       sum( (case when (MONTH(a.`DATA_ENVIO`) = 1 AND a.`MES_REFERENCIA` = 1) then 1 else 0 end) "jan" ...
group by a.`USUARIO

 

`

Compartilhar este post


Link para o post
Compartilhar em outros sites
SELECT
    a.`USUARIO`,
    (IF((SELECT MONTH(b.`DATA_ENVIO`) FROM rh_resumos b WHERE b.usuario=a.usuario AND MONTH(b.`DATA_ENVIO`)=1 AND b.MES_REFERENCIA=1) IS NOT NULL,1,0)) AS 'JAN',
    (IF((SELECT MONTH(b.`DATA_ENVIO`) FROM rh_resumos b WHERE b.usuario=a.usuario AND MONTH(b.`DATA_ENVIO`)=2 AND b.MES_REFERENCIA=2) IS NOT NULL,1,0)) AS 'FEV',
    (IF((SELECT MONTH(b.`DATA_ENVIO`) FROM rh_resumos b WHERE b.usuario=a.usuario AND MONTH(b.`DATA_ENVIO`)=3 AND b.MES_REFERENCIA=3) IS NOT NULL,1,0)) AS 'MAR'
FROM rh_resumos a
GROUP BY a.`USUARIO`

eu nao testei os parenteses pq n tenho as tuas tabelas

 

pelo que entendi, o problema da query anterior é que a.data_envio e a.mes_referencia são varios resultados por causa do group by, dai eu o mysql deve interpretar o ultimo, por isso janeiro veio como false

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.