Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Query como verificar quantidade de pessoas no restaurante

Boa tarde pessoal!

Por favor estou precisando criar uma query para verificar quantas pessoas estão no restaurante da minha empresa para confrontar com a quantidade de lugares disponíveis.

Criei a query abaixo no qual ela me traz todos os colaboradores que passaram pela catraca do restaurante em um determinado horário.

SELECT CP.PES_NUMERO AS 'NÚMERO CRACHA', P.PES_NOME AS 'COLABORADOR', P.EST_NUMERO AS 'CENTRO DE CUSTO',CONVERT(VARCHAR(20),L.MOV_DATAHORA,113) AS 'DATA E HORA'
FROM CRED_PESSOAS AS CP
JOIN LOG_CREDENCIAL AS L
ON CP.CRED_NUMERO = L.CRED_NUMERO
JOIN PESSOAS AS P
ON CP.PES_NUMERO = P.PES_NUMERO
WHERE L.MOV_DATAHORA >= CONVERT(CHAR,GETDATE(),103) 
ORDER BY L.MOV_DATAHORA DESC

Essa query traz as "batidas" do crachá tanto de entrada como saída bem como outras informações, minha ideia é que a query teria confrontar se a pessoa deu a batida de entrada mas não ainda a de saída dessa forma indicaria que ela ainda está no local e assim faria uma conta simples confrontando a quantidade de pessoas que estão no restaurante (-) a quantidade de lugares disponíveis.

Muito obrigado


5 respostas

Boa noite Tiago!

Não dá pra te ajudar sem saber a estrutura das tabelas.

Seu banco é MySQL? Se for, dá um "desc nome_da_tabela" pra mostrar os campos e posta o resultado aqui.

Provavelmente tem uma coluna na tabela LOG_CREDENCIAL classificando as batidas como entrada e saída. Se não tiver, conta quantas batidas tem e deduz o estado do cliente (dentro ou fora).

Bom dia Jonas,

Muito obrigado pela resposta, meu banco é SQL Server, analisando melhor essa tabela LOG_CREDENCIAL verifiquei que há um campo que indica que a pessoa entrou no restaurante que seria o campo MOV_ENTRADASAIDA a mesma é populada com 1 para ENTRADA e 2 para SAÍDA.

SELECT * FROM LOG_CREDENCIAL
WHERE MOV_DATAHORA >= '24 Ago 2018 11:10:00' AND MOV_ENTRADASAIDA = 1 

Retorno do comando:
445660    206162591104    1    2018-08-24 11:14:35.000    1    29    2    3    1    1    0    0    0    NULL    NULL
445661    206162591104    1    2018-08-24 11:14:39.000    1    29    2    3    1    1    0    0    0    NULL    NULL
445662    206162591104    1    2018-08-24 11:14:46.000    1    29    2    3    1    1    0    0    0    NULL    NULL
445663    463862018306    1    2018-08-24 11:15:07.000    1    10    2    3    1    1    10085    0    0    NULL    NULL
445664    360782648164    1    2018-08-24 11:15:11.000    1    10    2    3    1    1    10058    0    0    NULL    NULL
445665    463862004408    1    2018-08-24 11:15:13.000    1    10    2    3    1    1    10169    0    0    NULL    NULL
445666    206162571294    1    2018-08-24 11:15:15.000    1    10    2    3    1    1    10002    0    0    NULL    NULL
445667    206162582034    1    2018-08-24 11:15:17.000    1    10    2    3    1    1    10066    0    0    NULL    NULL
445668    360782707151    1    2018-08-24 11:15:20.000    1    10    2    3    1    1    10154    0    0    NULL    NULL
445669    360782717986    1    2018-08-24 11:15:25.000    1    10    2    3    1    1    100305    0    0    NULL    NULL
445670    206162588487    1    2018-08-24 11:15:29.000    1    10    2    3    1    1    10088    0    0    NULL    NULL
445671    463862013440    1    2018-08-24 11:15:32.000    1    10    2    3    1    1    10139    0    0    NULL    NULL
445672    206162589023    1    2018-08-24 11:15:34.000    1    10    2    3    1    1    10094    0    0    NULL    NULL
445673    206162596153    1    2018-08-24 11:15:36.000    1    10    2    3    1    1    10073    0    0    NULL    NULL
445674    463862001546    1    2018-08-24 11:15:38.000    1    10    2    3    1    1    100341    0    0    NULL    NULL
445675    463862016601    1    2018-08-24 11:15:44.000    1    10    2    3    1    1    100141    0    0    NULL    NULL
445676    463862001527    1    2018-08-24 11:15:52.000    1    10    2    3    1    1    100386    0    0    NULL    NULL
445677    463862013650    1    2018-08-24 11:15:59.000    1    10    2    3    1    1    100385    0    0    NULL    NULL
445678    463862002293    1    2018-08-24 11:16:04.000    1    10    2    3    1    1    100395    0    0    NULL    NULL

Fiz uma query para armazenar as entradas por tipo convertendo para número conforme abaixo:

SELECT COUNT (*) AS 'TESTE' INTO #LUGARES FROM LOG_CREDENCIAL WHERE MOV_ENTRADASAIDA = 2 AND MOV_DATAHORA >= CONVERT(CHAR,GETDATE(),103) 

A questão que tenho agora é a seguinte por favor preciso de ajuda para formular a lógica.

Como poderia fazer para diferenciar quando a entrada é 1 e ainda não foi populada para 2? A tabela não aceita Null

Obrigado

solução!

Boa tarde Tiago!

Não há de quê!

Você vai precisar de dois counts e fazer a diferença entre eles.

Não precisa utilizar a cláusula into.

Segue a query:

SELECT L.MOV_DATAHORA
      ,(SELECT COUNT(L1.id) FROM LOG_CREDENCIAL L1 WHERE L1.MOV_ENTRADASAIDA = 1) AS 'ENTRADAS'
      ,(SELECT COUNT(L2.id) FROM LOG_CREDENCIAL L2 WHERE L2.MOV_ENTRADASAIDA = 2) AS 'SAIDAS'
      ,(ENTRADAS - SAIDAS) AS 'DIFERENCA' 
FROM LOG_CREDENCIAL L WHERE L.MOV_DATAHORA = GETDATE();

Testa aí e me diz se funcionou ou não.

Uma outra forma de chegar no mesmo resultado seria desta forma:


select 
SUM (case when MOV_ENTRADASAIDA = 1 then 1 else 0 end) as entradas,
sum(case when MOV_ENTRADASAIDA = 2 then 1 else 0 end) as saidas, 
SUM (case when MOV_ENTRADASAIDA = 1 then 1 else 0 end) - sum(case when MOV_ENTRADASAIDA = 2 then 1 else 0 end) as diferenca
from LOG_CREDENCIAL where MOV_DATAHORA >= '(INTERVALO DE TEMPO DESEJADO)'

Boa tarde muito obrigado pelo auxilio,

Na verdade tanto a solução dada pelo Jonas quanto pelo Daniel funcionaram!

Fazer curso na Alura vale cada centavo!