Fórum Como posso unir dois selects com colunas diferentes? #600150
30/01/2019
0
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
Curtir tópico
+ 0Post mais votado
31/01/2019
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
Gostei + 1
Mais Posts
30/01/2019
Pablo Carvalho
Tenta postar pra gente esse seu SQL formatado, porque ai facilita pra gente!
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...
Gostei + 0
31/01/2019
Rodrigo Santos
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.
Gostei + 0
31/01/2019
Alex Lekao
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,
Gostei + 0
31/01/2019
Emerson Nascimento
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
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)
Inserção de url
Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.