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:

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

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

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...
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:
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
Responder

Gostei + 0

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

Aceitar