JoaoVM 0 Denunciar post Postado Novembro 18, 2013 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
paulojuchem 20 Denunciar post Postado Novembro 19, 2013 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
Motta 645 Denunciar post Postado Novembro 19, 2013 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
JoaoVM 0 Denunciar post Postado Novembro 19, 2013 A estrutura da minha tabela é esta.. 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
paulojuchem 20 Denunciar post Postado Novembro 21, 2013 quando voce trocou o id do meu exemplo pelo id da sua tabela, o que retornou? erro? Compartilhar este post Link para o post Compartilhar em outros sites
Motta 645 Denunciar post Postado Novembro 21, 2013 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
JoaoVM 0 Denunciar post Postado Novembro 22, 2013 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
Motta 645 Denunciar post Postado Novembro 22, 2013 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
JoaoVM 0 Denunciar post Postado Novembro 22, 2013 É 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
paulojuchem 20 Denunciar post Postado Novembro 22, 2013 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
Motta 645 Denunciar post Postado Novembro 22, 2013 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
JoaoVM 0 Denunciar post Postado Novembro 22, 2013 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
Motta 645 Denunciar post Postado Novembro 22, 2013 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
JoaoVM 0 Denunciar post Postado Novembro 22, 2013 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
paulojuchem 20 Denunciar post Postado Novembro 22, 2013 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
JoaoVM 0 Denunciar post Postado Novembro 22, 2013 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