Ir para conteúdo

POWERED BY:

Arquivado

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

JoaoVM

Conjunto de Ultimos Registos

Recommended Posts

Bom dia, tenho um problema numa query MySQL que é simples mas não estou a conseguir resolver, ou por falta de atenção ou não sei, vejamos:

 

Tenho um conjunto de funcionários que entram e saem da linha de produção, quando passam o cartão é inserida uma entrada e quando passam novamente é inserida uma saída, o que quero e devolver todos os colaboradores que deram entrada mas não deram a saída, ou seja, saber os funcionários que estão presentes no momento.

 

 

Vejamos o meu exemplo:

 

select distinct num_colab, pnome, unome, evento, data, hora 
from transacoes_bmw 
where data=timestamp(current_date()) 
        and evento='E'
order by hora asc;

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

voce poderia postar a estrutura da tabela em questão? vou assumir que o evento 'E' = entrada e 'S' = saida e que data = DATE

 

 

SELECT a.num_colab, a.pnome, a.unome, a.evento, a.data, a.hora FROM transacoes_bmw a WHERE a.data=CURRENT_DATE AND a.evento='E' AND a.id NOT IN(SELECT b.id FROM transacoes_bmw b WHERE b.evento='S' AND b.id IN (a.id)) GROUP BY a.num_colab ORDER BY hora ASC;
 

 

acho que essa lógica esta meio doida, mas vaiq vai q

Compartilhar este post


Link para o post
Compartilhar em outros sites

Not in ou not exists como no exemplo acima, apenas acho que falta testar a data no subselect.

Compartilhar este post


Link para o post
Compartilhar em outros sites

A estrutura da minha tabela é esta..

 

90ws.png

 

caso não percebam posso explicar melhor a tabela e o objetivo, que é mostrar os colaboradores que deram a entrada e ainda não deram a saída, basicamente é mostrar os colaboradores que o seu ultimo movimento foi uma entrada 'E'.

Compartilhar este post


Link para o post
Compartilhar em outros sites

ALGO ASSIM

 

 

select distinct NUM_COLAB, PNOME, UNOME, EVENTO, data, HORA
from   transacoes_bmw
where data=timestamp(current_date())
and EVENTO='E'
and not exists (select null
                from   TRANSACOES_BMW TRANSACOES_BMW_S
                where TRANSACOES_BMW_S.data=  TRANSACOES_BMW.data
                AND TRANSACOES_BMW_S.NUM_COLAB =  TRANSACOES_BMW.NUM_COLAB
                and EVENTO='S')
order by hora asc;

Compartilhar este post


Link para o post
Compartilhar em outros sites

paulojuchem não retornou erro..devolveu os registos com a Entrada mesmo que o ultimo registo tenha sido uma saída.

Motta não percebo a sua query, porque select null? não falta um AS no from? de qualquer maneira não funciona, fica a carregar e não devolve nada..

Compartilhar este post


Link para o post
Compartilhar em outros sites

O subselect é para vericar se não existe correspondente (colaborador e dia) de saída, como não precisa retornar nada se usa Null na coluna.

 

Não tenho como testar mas passei a ideia básica da query.

Compartilhar este post


Link para o post
Compartilhar em outros sites

É como melhorei, ou não ;)..continua a carregar e não anda...

penso que o que tinhas na subquery na parte do from estava confuso..se não for isto que querias avisa que posso estar a pensar mal..

 

select distinct N.num_colab, N.pnome, N.unome, N.evento, N.data, N.hora
from transacoes_bmw as N
where N.data=timestamp(current_date())
and N.evento='E'
and not exists (select NULL
		from transacoes_bmw AS s, transacoes_bmw AS n
		where s.data=n.data
		AND s.num_colab = n.num_colab
		AND s.evento='S')
order by N.hora asc;

Compartilhar este post


Link para o post
Compartilhar em outros sites

SELECT a.num_colab, a.pnome, a.unome, a.evento, a.data, a.hora FROM transacoes_bmw a WHERE a.data=CURRENT_DATE AND a.evento='E' AND a.id NOT IN(SELECT b.id FROM transacoes_bmw b WHERE b.evento='S' AND b.data=CURRENT_DATE) GROUP BY a.num_colab ORDER BY hora ASC;

da uma olhada se isso ajuda, me equivoquei no exemplo anterior, ele nao fazia sentido..

Compartilhar este post


Link para o post
Compartilhar em outros sites

tente assim

 

 

select distinct N.num_colab, N.pnome, N.unome, N.evento, N.data, N.hora
from transacoes_bmw as N
where N.data=timestamp(current_date())
and N.evento='E'
and not exists (select NULL
        from transacoes_bmw AS s, transacoes_bmw AS o
        where s.data=o.data
        AND s.num_colab = o.num_colab
        and o.data = ndata
        and o.num_colab = n.num_colab
        AND s.evento='S')
order by N.hora asc;

Compartilhar este post


Link para o post
Compartilhar em outros sites

paulojuchem, o seu devolve todos os valores que tem um E mesmo quando o ultimo registo é um S, ou seja, devolve as entradas, diz que o colaborador está presente mesmo quando já deu saída.

Motta, o seu não devolve nada, fica a mastigar, fiz um teste e quando faço sem a subquery devolve as entradas, quando faço apenas a subquery devolve as saídas, mas sem a subquery ele não fica a mastigar, devolve o que ja, falei as entradas e a subquery também funciona mas apenas sozinha...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vc não quer as entradas sem saídas de um dia ?

 

Existem casos assim ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vou explicar melhor:

O que quero é as entradas sem saídas atuais...

 

 

1) O funcionário entra na linha (E)-> neste momento está dentro

2) O funcionário sai da linha (S)-> neste momento está fora

3) O funcionário entra na linha(E) -> Neste momento está dentro

 

Aqui pretendo quem me devolva o valor 1, sendo que tenho um funcionário dentro da linha

 

------------------------------------------

 

1) O funcionário entra na linha (E) -> neste momento está dentro

2) O funcionário sai da linha(S) -> neste momento está fora

3) O funcionário entra na linha (E)-> Neste momento está dentro

4) O funcionário sai da linha (S)-> neste momento está fora

 

Aqui pretendo quem me devolva o valor 0, sendo que não tenho nenhum funcionário dentro da linha

Compartilhar este post


Link para o post
Compartilhar em outros sites

SELECT 
     a.num_colab, 
     a.pnome, 
     a.unome, 
     a.evento, 
     a.data, 
     a.hora FROM transacoes_bmw a 
WHERE 
     a.data=CURRENT_DATE AND 
     a.evento='E' AND 
     ( SELECT b.id FROM transacoes_bmw b WHERE b.evento='S' AND b.id > a.id ) IS NULL
ORDER BY hora ASC;

 

eu ja tive que fazer algo semelhante uma vez, mas eu nao me recordo o que eu fiz...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Malta encontrei duas soluções:

Criei uma vista com uma coluna que tem o nr de registos de entrada e outra com o nr de registos de saída. Depois nessa vista subtrai o nr de entradas pelo numero de saídas, e obtenho o resultado corretamente.

Ambas funcionam corretamente, fica a solução ;)

Vou postar as duas soluções:

/*VISTA QUE DEVOLVE O NUMERO DE COLABORADORES DENTRO E O NUMERO DE COLABORADORES FORA*/
CREATE VIEW TOTAL_BMW AS
SELECT distinct count(a.num_colab) as TOTAL_OUT, (SELECT distinct count(b.num_colab)
  FROM transacoes_bmw as b
  WHERE b.linha = 126
   AND b.evento='E'
     AND b.data=current_date()) AS TOTAL_IN
FROM transacoes_bmw as a
WHERE a.linha = 126
AND a.evento='S'
   AND a.data=current_date()
ORDER BY a.data desc,
  a.hora desc;

/*QUERY PARA CALCULAR O TOTAL DE COLABORADORES (TOTAL_DENTRO - TOTAL_FORA)*/
SELECT `TOTAL_IN`-`TOTAL_OUT` AS TOTAL FROM TOTAL_BMW


/*SOLUCAO DE UM AMIGO*/
SELECT COUNT(T1.num_colab) AS TOTAL                                                                    
  FROM transacoes_bmw as T1                                                            
WHERE T1.linha = 126                                                                
   AND T1.evento = 'E'                                                                
   AND concat(T1.data, ' ', T1.hora) = (SELECT concat(T2.data, ' ', T2.hora) as data2  
                                          FROM transacoes_bmw as T2                    
                                         WHERE T2.linha = T1.linha                    
                                           AND T2.num_colab = T1.num_colab        
                                      ORDER BY data2 DESC                            
                                         LIMIT 1)

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.