Como posso unir dois selects com colunas diferentes?
Boa noite!
Preciso que na minha consulta retorne a primeira entrada e ultima saída , ordenado por dia.
Atualmente minha query está assim:
As ultimas colunas são Hora min. e Hora max , como juntar ambas na mesma linha?
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
Curtidas 0
Melhor post
Alex Lekao
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,
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,
GOSTEI 1
Mais Respostas
Pablo Carvalho
30/01/2019
Fala Rodrigo, beleza?
Tenta postar pra gente esse seu SQL formatado, porque ai facilita pra gente!
Tenta postar pra gente esse seu SQL formatado, porque ai facilita pra gente!
GOSTEI 0
Rodrigo Santos
30/01/2019
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
Rodrigo Santos
30/01/2019
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.
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
Alex Lekao
30/01/2019
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,
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
Emerson Nascimento
30/01/2019
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
GOSTEI 0