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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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 :)