Ir para conteúdo

Arquivado

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

robson_castro

sql

Recommended Posts

Pessoal,

 

Tenho esses valores,

IDFUN DATA HORA TIPO

1914 09/04/2007 07:31:00 E

1914 09/04/2007 12:01:00 S

1914 09/04/2007 13:19:00 E

1914 09/04/2007 17:31:00 S

 

 

Preciso que mostre assim:

IDFUN DATA ENTRADA SAIDA

1914 09/04/2007 07:31:00 12:01:00

1914 09/04/2007 13:19:00 17:31:00

 

Montei esse script mais está duplicando o resultado 4 x

SELECT

R.IDFUNCIONARIO,

R.DATA,

R1.HORA ENTRADA,

R2.HORA SAIDA FROM REL_PONTO R, REL_PONTO R1, REL_PONTO R2

WHERE

R1.IDFUNCIONARIO = R.IDFUNCIONARIO AND R1.TIPO = 'E' AND R1.DATA BETWEEN :DATA1 AND :DATA2 AND

R2.IDFUNCIONARIO = R.IDFUNCIONARIO AND R2.TIPO = 'S' AND R2.DATA BETWEEN :DATA1 AND :DATA2 AND

R.DATA BETWEEN :DATA1 AND :DATA2 AND R.IDFUNCIONARIO = 1914

ORDER BY R.IDFUNCIONARIO,R.HORA

 

Alguém poderia me dar uma ajuda?

 

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Camarada,Pq você não colocar um DISTINCT na sua expressão e grava um tabela temporária, vai vir osdaos repetidos na no lay-out que você quer ai dê um SELECT na tabela temporária com GROUP BY.Outra idéia era colocar um GROUP BY na suam expressão! Com não tenho sua base de dos não tenho como testar.Isto é só uma sugestão para que você não fique parado sem desenvolver! Estou meio sem tempo hj!!Outros amigos do forúm vão poder sugerir outras formas de resolver sua pendência.t+

Compartilhar este post


Link para o post
Compartilhar em outros sites

Camadara,

 

Normalmente existem várias maneiras de se chegar ao msm resultado!

 

Como eu disse estou sem o server do SQL e não tenho como testar!

 

Se você não estiver com e puder esperar uma solução elegante beleza... é altemente recomendável criar soluções robustar e elegantes.

 

Agora as vezes não temos mto tempo, o maldito cronograma, dai podemos utilizar soluções não tão elegante assim mas que em materia de performance não compromete.

 

você tento utilizar o GROUP BY na sua expressão com eu sugeri?

 

 

Pode ficar calmo que alguém aqui vai lhe ajudar.

 

t+

 

 

 

Rapaz,

 

Eu já havia realizado algo parecido, lembro que não era necessário utilizar tabelas temporárias.

 

Não lembro como é feito.

 

Dar uma força aí pessoal!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Camarada,No GROUP BY você não precisa usar necessariamente um agregador você pode utilizar o MAX para pegar o maior valor tipo:

CREATE TABLE #REL_PONTO (IDFUNCIONARIO INT, DATA DATETIME, HORA DATETIME, TIPO CHAR(2))INSERT INTO #REL_PONTO (IDFUNCIONARIO,DATA,HORA,TIPO) VALUES (1914, '09/04/2007','07:31:00','E')INSERT INTO #REL_PONTO (IDFUNCIONARIO,DATA,HORA,TIPO) VALUES (1914, '09/04/2007','12:01:00','S')INSERT INTO #REL_PONTO (IDFUNCIONARIO,DATA,HORA,TIPO) VALUES (1914, '09/04/2007','13:19:00','E')INSERT INTO #REL_PONTO (IDFUNCIONARIO,DATA,HORA,TIPO) VALUES (1914,  '09/04/2007','17:31:00','S')SELECT * FROM #REL_PONTOSELECT R.IDFUNCIONARIO,R.DATA,MAX(R1.HORA) AS ENTRADA,MAX(R2.HORA) AS SAIDA FROM #REL_PONTO R, #REL_PONTO R1, #REL_PONTO R2WHERER1.IDFUNCIONARIO = R.IDFUNCIONARIO AND R1.TIPO = 'E' AND R1.DATA BETWEEN '09/04/2007' AND '09/04/2007' ANDR2.IDFUNCIONARIO = R.IDFUNCIONARIO AND R2.TIPO = 'S' AND R2.DATA BETWEEN '09/04/2007' AND '09/04/2007' ANDR.DATA BETWEEN '09/04/2007' AND '09/04/2007' AND R.IDFUNCIONARIO = 1914GROUP BY R.IDFUNCIONARIO,R.DATADROP TABLE #REL_PONTO
Talvez isto lhe dê uma idéia de como fazer o q você quer.t+

jothaz,Não utilizei o group by porque não estou utilizando agregação para esta consulta.Obrigado pela atenção.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigo,Eu já tentei da forma como você relatou porém não funciona visto que a consulta deverá listar 2 ou registro no resultados, conforme o número de vezes que o funcionário entra (ENTRADA) ou sai (SAÍDA). Se eu utilizar esta agregação (MIN/MAX) a consulta me trará somente um registro e a idéia é listar conforme já relatei.Se eu fizar da forma como você relata o resultado será este:IDFUN DATA ENTRADA SAIDA1914 04/04/2007 13:04:00 17:37:00E o que eu preciso é este:IDFUN DATA ENTRADA SAIDA1914 09/04/2007 07:31:00 12:01:001914 09/04/2007 13:19:00 17:37:00

Compartilhar este post


Link para o post
Compartilhar em outros sites

Camarada,O exemplo foi msm só para você se guiar. Nem sempre tenho tempo de refinar os post pois estou no trampo e hj aqui tá infernal.Tentei isso:

SELECT R.IDFUNCIONARIO,R.DATA,R1.HORA AS ENTRADA,MAX(R2.HORA) AS SAIDA FROM #REL_PONTO R, #REL_PONTO R1, #REL_PONTO R2WHERER1.IDFUNCIONARIO = R.IDFUNCIONARIO AND R1.TIPO = 'E' AND R1.DATA BETWEEN '09/04/2007' AND '09/04/2007' ANDR2.IDFUNCIONARIO = R.IDFUNCIONARIO AND R2.TIPO = 'S' AND R2.DATA BETWEEN '09/04/2007' AND '09/04/2007' ANDR.DATA BETWEEN '09/04/2007' AND '09/04/2007' AND R.IDFUNCIONARIO = 1914GROUP BY R.IDFUNCIONARIO,R.DATA,R1.HORA
Troca o MAX(R1.HORA) por R1.HORA e coloque R1.HORA no GROUP BY. Mas não fui feliz.Bom vamos esperar a ajuda de alguém do forum ou eu ter outra idéia. t+

Amigo,Eu já tentei da forma como você relatou porém não funciona visto que a consulta deverá listar 2 ou registro no resultados, conforme o número de vezes que o funcionário entra (ENTRADA) ou sai (SAÍDA). Se eu utilizar esta agregação (MIN/MAX) a consulta me trará somente um registro e a idéia é listar conforme já relatei.Se eu fizar da forma como você relata o resultado será este:IDFUN DATA ENTRADA SAIDA1914 04/04/2007 13:04:00 17:37:00E o que eu preciso é este:IDFUN DATA ENTRADA SAIDA1914 09/04/2007 07:31:00 12:01:001914 09/04/2007 13:19:00 17:37:00

Compartilhar este post


Link para o post
Compartilhar em outros sites

tarrrrde camaradas

 

tenta isso

SET NOCOUNT ONSET DATEFORMAT DMYDECLARE @TESTE TABLE (IDFUN INT, DATA DATETIME, HORA DATETIME, TIPO CHAR(1))INSERT INTO @TESTE (IDFUN, DATA, HORA, TIPO) VALUES (1914, '09/04/2007', '07:31:00', 'E')INSERT INTO @TESTE (IDFUN, DATA, HORA, TIPO) VALUES (1914, '09/04/2007', '12:01:00', 'S')INSERT INTO @TESTE (IDFUN, DATA, HORA, TIPO) VALUES (1914, '09/04/2007', '13:19:00', 'E')INSERT INTO @TESTE (IDFUN, DATA, HORA, TIPO) VALUES (1914, '09/04/2007', '17:31:00', 'S')SELECT 	(IDFUN), 	(DATA), 	(HORA),	(SELECT TOP 1 (HORA) FROM @TESTE M WHERE TIPO = 'S' AND M.DATA >= T.DATA AND M.HORA >= T.HORA ORDER BY DATA ASC, HORA ASC) AS SAIDAFROM @TESTE T WHERE TIPO = 'E'

EDIT.: agora sim, com sub-select foi

 

 

t+

abs

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mestre eriva_br,

 

Como sempre perfeito!! http://forum.imasters.com.br/public/style_emoticons/default/clap.gif

 

 

robson_castro não lhe que alguém ajudaria!

 

 

Agora só questionamento!

 

Todos os registros terão entrada e saida?

 

t+

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim amigo, o funcionário passa o crachá quando chega pela manhã, ao sair para o almoço, ao retorno do almoço e ao fim da jornada de trabalho.Eu não estou utilizando Sql server. Estou utilizando Firebird, resolvi pedir ajuda aqui por ser a minha dúvida relacionada a script e também por ser este fórum um local onde grandes profissionais postam.Estou acompanhando os postes e testando, quando eu conseguir, informarei.Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

eriva_br botando a caxola pra funfar hehehee

você ve o que o feriado não faz....huahauuhauha

Mestre eriva_br,

 

Como sempre perfeito!! http://forum.imasters.com.br/public/style_emoticons/default/clap.gif

valew galera... http://forum.imasters.com.br/public/style_emoticons/default/worshippy.gif

é nóis

 

 

 

Sim amigo, o funcionário passa o crachá quando chega pela manhã, ao sair para o almoço, ao retorno do almoço e ao fim da jornada de trabalho.

 

Eu não estou utilizando Sql server. Estou utilizando Firebird, resolvi pedir ajuda aqui por ser a minha dúvida relacionada a script e também por ser este fórum um local onde grandes profissionais postam.

 

Estou acompanhando os postes e testando, quando eu conseguir, informarei.

robson, e esse esquema que passei do sub-select, não funfo no firebird?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ajudaí pessoal!Não funciona eriva_br.

que pena em SQL Server funcionou que é uma beleza..mas firebird não suporta sub-select?desculpe mas nunca usei ele

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aceita sim subquery, só não dar suporte a tabelas tamporárias conforme seu exemplo (pelo menos até onde eu sei)

ahh sim as tabelas temporarias com ctz não, só criei para realizar o exemplo, para ter dados para eu testar, mas tipo tenta adaptar só a parte do select, talvez funcione ou de uma luzt+

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.