Fórum Como posso unir dois selects com colunas diferentes? #600150

30/01/2019

0

SQL

Boa noite!
Preciso que na minha consulta retorne a primeira entrada e ultima saída , ordenado por dia.
Atualmente minha query está assim:

SELECT  
                ncAreaEventoArq.*, TBE.HMin, NULL
FROM
                ncAreaEventoArq
INNER JOIN
(
                SELECT 
                               PessoaID, 
                               UsuarioTipo, 
                               MIN(DataHora) HMin
                FROM 
                               ncAreaEventoArq
                WHERE
                               DataHora
                BETWEEN
                               (''2018/01/01 00:00:00'')
                AND
                               (''2018/01/30 23:59:59'')
                AND
                               (UsuarioTipo = 0 OR UsuarioTipo = 1 OR UsuarioTipo = 2) AND Evento = 1
                AND
                               PessoaNome = ''SEGURANÇA P09''            
                GROUP BY
                               PessoaID,
                               UsuarioTipo,
                               Convert(date, DataHora)
) TBE
ON
                TBE.PessoaID = ncAreaEventoArq.PessoaID
AND
                TBE.HMin = ncAreaEventoArq.DataHora
UNION ALL
SELECT
                ncAreaEventoArq.*, NULL, TBS.HMax
FROM
                ncAreaEventoArq
INNER JOIN
(
                SELECT
                               PessoaID,
                               UsuarioTipo,
                               MAX(DataHora) HMax 
                FROM 
                               ncAreaEventoArq
                WHERE
                               DataHora
                BETWEEN
                               (''2018/01/01 00:00:00'')
                AND
                               (''2018/01/30 23:59:59'')
                AND
                               (UsuarioTipo = 0 OR UsuarioTipo = 1 OR UsuarioTipo = 2) AND Evento = 2
                AND
                               PessoaNome = ''SEGURANÇA P09''
                GROUP BY
                               PessoaID,
                               UsuarioTipo,
                               Convert(date, DataHora)
) TBS
ON
                TBS.PessoaID = ncAreaEventoArq.PessoaID
AND
                TBS.HMax = ncAreaEventoArq.DataHora
ORDER BY
                ncAreaEventoArq.DataHora


As ultimas colunas são Hora min. e Hora max , como juntar ambas na mesma linha?
Rodrigo Santos

Rodrigo Santos

Responder

Post mais votado

31/01/2019

Oi Rodrigo, bom dia!!!

Cara a primeira coisa que eu sugeriria era vc tentar mudar a sua query e usar no lugar do inner join ou outer apply(pressupondo que seja sql server, não sei se isso tem em outros bancos. rsrsr), acredito que será melhor para vc ter os resultados e terá melhor performance.

É possível também, se obter esse resultado utilizando subselects, menos performático que o outer apply.

Com qqr uma das duas formas que mencionei vc as coloca tudo em uma unica linha.

No caso do SubSelect entra como colunas normais, a unida diferença eh que eh um select que monta aquela coluna.

No caso do outer apply vc informa a coluna que vc "criou" ou nomeou na instrução do outer apply, ficando como uma coluna também e em uma linha, conforme vc deseja.

Não analisei seu código a fundo, por isso só sugeri esses ajustes.

Espero ter ajudado.

Atenciosamente,

Alex Lekao

Alex Lekao
Responder

Gostei + 1

Mais Posts

30/01/2019

Pablo Carvalho

Fala Rodrigo, beleza?

Tenta postar pra gente esse seu SQL formatado, porque ai facilita pra gente!


Responder

Gostei + 0

31/01/2019

Rodrigo Santos

SELECT  
	ncAreaEventoArq.*, TBE.HMin, NULL
FROM
	ncAreaEventoArq
INNER JOIN
(
	SELECT 
		PessoaID, 
		UsuarioTipo, 
		MIN(DataHora) HMin
	FROM 
		ncAreaEventoArq
	WHERE
		DataHora
	BETWEEN
		(''2018/01/01 00:00:00'')
	AND
		(''2018/01/30 23:59:59'')
	AND
		(UsuarioTipo = 0 OR UsuarioTipo = 1 OR UsuarioTipo = 2) AND Evento = 1
	AND
		PessoaNome = ''SEGURANÇA P09''	
	GROUP BY
		PessoaID,
		UsuarioTipo,
		Convert(date, DataHora)
) TBE
ON
	TBE.PessoaID = ncAreaEventoArq.PessoaID
AND
	TBE.HMin = ncAreaEventoArq.DataHora
UNION ALL
SELECT
	ncAreaEventoArq.*, NULL, TBS.HMax
FROM
	ncAreaEventoArq
INNER JOIN
(
	SELECT
		PessoaID,
		UsuarioTipo,
		MAX(DataHora) HMax 
	FROM 
		ncAreaEventoArq
	WHERE
		DataHora
	BETWEEN
		(''2018/01/01 00:00:00'')
	AND
		(''2018/01/30 23:59:59'')
	AND
		(UsuarioTipo = 0 OR UsuarioTipo = 1 OR UsuarioTipo = 2) AND Evento = 2
	AND
		PessoaNome = ''SEGURANÇA P09''
	GROUP BY
		PessoaID,
		UsuarioTipo,
		Convert(date, DataHora)
) TBS
ON
	TBS.PessoaID = ncAreaEventoArq.PessoaID
AND
	TBS.HMax = ncAreaEventoArq.DataHora
ORDER BY
	ncAreaEventoArq.DataHora


Melhorou?...
Não tinha visto que não estava formatado...
Responder

Gostei + 0

31/01/2019

Rodrigo Santos

Bom dia Alex!!

Então eu estou utilizando o INNER JOIN por causa que preciso ter a certeza de que a Primeira Entrada e Ultima Saída, sejam da mesma pessoa, para ser exibido no relatório, tentei utilizar somente com Subquery, mas pelo fato de quando utilizo o Group By Somente pela Data os valores das duas colunas(HMin e HMax) não batem, ficando apenas uma coluna com os dados certos e a outra com dados repetidos em diversas linhas.

Responder

Gostei + 0

31/01/2019

Alex Lekao

Oi Rodrigo,

Então, para usar a subselect vc teria que ter as duas, uma para cada coluna, com isso vc garantiria os dados corretos.

No caso do outer apply que mencionei, seriam duas instruções utilizando o outer, uma para cada data, similar as subquaries, a diferença eh que o outer lhe confere mais performance e possibilidade de uso.

no outer vc consegue fazer uma serie de tratamentos dentro da instruçãoo e so informar as colunas tratadas na select principal, abre bastante o leque de opçoes de utilização.

Mas vamos aprofundando mais nas discuções que vc vai achar o que precisa e ficará top a opção adotada.

Atenciosamente,
Responder

Gostei + 0

31/01/2019

Emerson Nascimento

não sei se já resolveu, mas segue uma instrução que apresenta a menor entrada e a maior saída, para uma mesma pessoa, numa mesma linha:
SELECT
	PessoaID,
	UsuarioTipo,
	MIN(CASE WHEN Evento = 1 THEN DataHora ELSE NULL END) HMin,
	MAX(CASE WHEN Evento = 2 THEN DataHora ELSE NULL END) HMax
FROM
	ncAreaEventoArq
WHERE
	DataHora BETWEEN ('2018/01/01 00:00:00') AND ('2018/01/30 23:59:59')
	AND UsuarioTipo IN (0, 1, 2)
	AND PessoaNome = 'SEGURANÇA P09'
GROUP BY
	PessoaID,
	UsuarioTipo
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar