none
Tirar valores nulos (sem aplicação de min ou max) RRS feed

  • Pergunta

  • Boa tarde, estou com uma consulta que preciso trazer datas de entrada e saída de batida horarios aleatorios, preciso trazer todos.

    Preciso saber como eliminar os campos nulos e trazer a linha de saida_acesso ao lado da de entrada_acesso, sem aplicar max ou min, pois se eu fizer irá trazer o maior ou menor, quero trazer todos.



    CharlesTI.






    • Editado CHARLES.PTU sexta-feira, 29 de junho de 2018 17:03
    sexta-feira, 29 de junho de 2018 16:50

Respostas

Todas as Respostas

  • Deleted
    sexta-feira, 29 de junho de 2018 18:40
  • Boa tarde José diz.

    Se eu aplicar o MAX ou MIN o mesmo trará ou valor maximo ou minimo. Preciso trazer todos esses valores.


    CharlesTI.

    sexta-feira, 29 de junho de 2018 18:42
  • Eis o codigo original.

    select
    	CASE 
    		A.tipo_acesso
    	WHEN 1 THEN A.HORAS_CONVERTIDA
    	END 'entrada',
    	CASE 
    		A.tipo_acesso
    	when 2 THEN A.HORAS_CONVERTIDA
    	END  'saida'
    from
    (SELECT 
    	PPC.ID AS ID_PESSOAS,
    	EVA.pessoa_id AS ID_EVENTOSACESSOS,
    	CONVERT (DATETIME, EVA.DATA, 126)AS DATA_CONVERTIDA,
    	DBO.CONVERTESEGUNDOSEMHORAS(EVA.HORA) AS HORAS_CONVERTIDA,
    	EVA.DATA AS DATA_DE_ACESSO,
    	EVA.hora,
    	EVA.equipamento_id,
    	EVA.tipo_acesso,
    	EVA.descricao,
    	EVA.negado,
    	PPC.n_identificador AS MATRICULA,
    	PPC.NOME AS NOME_PESSOA,
    	SMA.NUMCARTEIRA AS NUMEROCARTEIR,
    	SMA.CODTURMA,
    	EVA.DATA AS DATA_EVA
    FROM 
    	[192.111.1.11].[SecullumAcessoNet].[DBO].PESSOAS  PPC (NOLOCK ) 
    	LEFT JOIN [192.111.1.11].[SecullumAcessoNet].[DBO].eventos_acessos EVA (NOLOCK) ON  PPC.id = EVA.pessoa_id 
    	LEFT JOIN SMATRICPL SMA (NOLOCK) ON  SMA.NUMCARTEIRA COLLATE SQL_Latin1_General_CP1_CI_AI = PPC.n_identificador COLLATE SQL_Latin1_General_CP1_CI_AI
    where
    sma.ra='118002420' 
    and CONVERT (DATETIME, EVA.DATA) = '2018-05-15') A


    CharlesTI.

    sexta-feira, 29 de junho de 2018 18:47
  • Boa tarde,

    Charles, talvez o exemplo do script abaixo possa ser adaptado para o seu caso:

    declare @Tabela table
    (IdPessoa int, Tipo_Acesso int, Data date, Hora time);
    
    insert into @Tabela values
    (1, 1, '20180601', '10:00'),
    (1, 2, '20180601', '11:00'),
    (1, 1, '20180602', '15:00'),
    (1, 2, '20180602', '16:00'),
    (2, 1, '20180601', '10:00'),
    (2, 1, '20180531', '8:00'),
    (2, 2, '20180531', '9:00'),
    (2, 1, '20180601', '11:00'),
    (2, 2, '20180601', '12:00'),
    (2, 1, '20180602', '20:00'),
    (2, 2, '20180602', '21:00'),
    (2, 2, '20180602', '22:00'),
    (2, 1, '20180603', '8:00'),
    (2, 2, '20180603', '9:00');
    
    with CTE_RN as
    (
        select
            *,
            row_number() over(partition by IdPessoa order by Data, Hora) as RN
        from @Tabela
    )
    
    select
        t1.IdPessoa,
        case when t1.Tipo_Acesso = 1 then t1.Data end as DataEnt,
        case when t1.Tipo_Acesso = 1 then t1.Hora end as HoraEnt,
        case when t2.Tipo_Acesso = 2 then t2.Data end as DataSai,
        case when t2.Tipo_Acesso = 2 then t2.Hora end as HoraSai
    from CTE_RN as t1
    left join CTE_RN as t2
        on 
            t1.IdPessoa = t2.IdPessoa and
            t1.RN = t2.RN - 1
    where
        (t1.Tipo_Acesso = 1) or
        (t1.Tipo_Acesso = 2 and t2.Tipo_Acesso = 2)

    Espero que seja útil


    Assinatura: http://www.imoveisemexposicao.com.br

    sexta-feira, 29 de junho de 2018 19:41
  • Boa tarde Gapimex.

    Deu erro sua consulta.

    Msg 1087, Level 15, State 2, Line 1
    Must declare the table variable "@Tabela".
    Msg 1087, Level 15, State 2, Line 22
    Must declare the table variable "@Tabela".


    CharlesTI.


    • Editado CHARLES.PTU sexta-feira, 29 de junho de 2018 19:59
    sexta-feira, 29 de junho de 2018 19:58
  • Deleted
    • Marcado como Resposta CHARLES.PTU sexta-feira, 29 de junho de 2018 20:42
    sexta-feira, 29 de junho de 2018 20:02
  • Charles,

    Talvez uma solução seja utilizar a função IsNull, e formatar a apresentação de um outro valor, pois a Max e Min não vai te ajudar.

    Ou então utilizar as função Lag ou Lead.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    sexta-feira, 29 de junho de 2018 20:17
  • Quando apliquei minha consula à sua consulta deu certo.

    O que vc falou no contexto fez sentido para nós, pois realmente tem casos que aluno irá bater entrada mas não vai ter saída, ou terá varias entradas e varias saídas ao mesmo.


    CharlesTI.

    sexta-feira, 29 de junho de 2018 20:42
  • Deleted
    sexta-feira, 29 de junho de 2018 20:43
  • Deleted
    sexta-feira, 29 de junho de 2018 22:34
  • José Diz, acho que nesse caso que você citou fica vulnerável mesmo, acho que não seria possível identificar que os horários citados não deveriam formar um par entrada-saida.

    Charles, ah quem me dera...

     

    Assinatura: http://www.imoveisemexposicao.com.br

    sábado, 30 de junho de 2018 00:09
  • José Diz, acho que nesse caso que você citou fica vulnerável mesmo, acho que não seria possível identificar que os horários citados não deveriam formar um par entrada-saida.

    Charles, ah quem me dera...

     

    Assinatura: http://www.imoveisemexposicao.com.br

    Gapimex,

    Também vejo desta forma, além disso, ficaria mais fácil fazer os tratamentos.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    terça-feira, 3 de julho de 2018 18:03