Ajuda com SQL(UNION X ORDER BY) ORACLE

4 respostas
phporacle11
D
Bom dia galera do Bem,

Assim, tenho o seguinte SQL:

SELECT * FROM

(SELECT COUNT(<em>) AS MANHA FROM TSEVENTODESC WHERE ISWEB = ‘N’ AND DTHRSOL BETWEEN TO_TIMESTAMP (‘01/04/2019 07:15:00’, ‘dd/mm/YY HH24:mi:ss’) AND TO_TIMESTAMP (‘01-04-2019 15:15:00’, ‘dd/mm/YY HH24:mi:ss’)),

(SELECT COUNT(</em>) AS TARDE FROM TSEVENTODESC WHERE ISWEB = ‘N’ AND DTHRSOL BETWEEN TO_TIMESTAMP (‘01/04/2019 15:15:00’, ‘dd/mm/YY HH24:mi:ss’) AND TO_TIMESTAMP (‘01-04-2019 23:15:00’, ‘dd/mm/YY HH24:mi:ss’)),

(SELECT COUNT(<em>) AS MADRUGADA FROM TSEVENTODESC WHERE ISWEB = ‘N’ AND DTHRSOL BETWEEN TO_TIMESTAMP (‘31/03/2019 23:15:00’, ‘dd/mm/YY HH24:mi:ss’) AND TO_TIMESTAMP (‘01-04-2019 07:15:00’, ‘dd/mm/YY HH24:mi:ss’))

UNION

SELECT * FROM

(SELECT COUNT(</em>) AS MANHA FROM TSEVENTODESC WHERE ISWEB = ‘N’ AND DTHRSOL BETWEEN TO_TIMESTAMP (‘02/04/2019 07:15:00’, ‘dd/mm/YY HH24:mi:ss’) AND TO_TIMESTAMP (‘02-04-2019 15:15:00’, ‘dd/mm/YY HH24:mi:ss’)),

(SELECT COUNT(<em>) AS TARDE FROM TSEVENTODESC WHERE ISWEB = ‘N’ AND DTHRSOL BETWEEN TO_TIMESTAMP (‘02/04/2019 15:15:00’, ‘dd/mm/YY HH24:mi:ss’) AND TO_TIMESTAMP (‘02-04-2019 23:15:00’, ‘dd/mm/YY HH24:mi:ss’)),

(SELECT COUNT(</em>) AS MADRUGADA FROM TSEVENTODESC WHERE ISWEB = ‘N’ AND DTHRSOL BETWEEN TO_TIMESTAMP (‘01/04/2019 23:15:00’, ‘dd/mm/YY HH24:mi:ss’) AND TO_TIMESTAMP (‘02-04-2019 07:15:00’, ‘dd/mm/YY HH24:mi:ss’))

UNION

SELECT * FROM

(SELECT COUNT(<em>) AS MANHA FROM TSEVENTODESC WHERE ISWEB = ‘N’ AND DTHRSOL BETWEEN TO_TIMESTAMP (‘03/04/2019 07:15:00’, ‘dd/mm/YY HH24:mi:ss’) AND TO_TIMESTAMP (‘03-04-2019 15:15:00’, ‘dd/mm/YY HH24:mi:ss’)),

(SELECT COUNT(</em>) AS TARDE FROM TSEVENTODESC WHERE ISWEB = ‘N’ AND DTHRSOL BETWEEN TO_TIMESTAMP (‘03/04/2019 15:15:00’, ‘dd/mm/YY HH24:mi:ss’) AND TO_TIMESTAMP (‘03-04-2019 23:15:00’, ‘dd/mm/YY HH24:mi:ss’)),

(SELECT COUNT(*) AS MADRUGADA FROM TSEVENTODESC WHERE ISWEB = ‘N’ AND DTHRSOL BETWEEN TO_TIMESTAMP (‘02/04/2019 23:15:00’, ‘dd/mm/YY HH24:mi:ss’) AND TO_TIMESTAMP (‘03-04-2019 07:15:00’, ‘dd/mm/YY HH24:mi:ss’))

Ao rodar este SQL, ele não retorna os valores ordenados pela data, no caso está retornando o resultado do dia 03/04 por primeiro, precisaria que ficasse na mesma ordem que está o sql…

desde já agradeço a atenção de todos.
Att.
Diego Silva

4 Respostas

T

Se entendi o que você quer, teste usando “ORDER BY 1”, que irá ordenar todo o resultado pela primeira coluna de cada union (que suponho ser o que você quer).

Obs: seu select parece que não precisa desses unions, apenas de agrupamentos por data (group by). Mas não avaliei no detalhe pra dizer com certeza.

Abraço.

D

Seria esta ideia meu amigo,
Preciso carregar os dados por dia, somando, por isso o count e separando por período, MADRUGRADA, MANHÃ e TARDE.

Pode me dar uma exemplo de como ficaria, estou quebrando cabeça nisso já fazem alguns dias…
Desde já agradeço.
Att.

T

Eu suponho que esse SQL já traz os dados que você quer, e o problema é só a ordem. Meu conhecimento de Oracle SQL está meio enferrujado, então confira a sintaxe. Mas seria algo assim:

SELECT * FROM
(SELECT
1 AS ORDEM, -- campo "virtual" de ordem
COUNT(*) AS MANHA FROM TSEVENTODESC WHERE ISWEB = ‘N’ AND DTHRSOL BETWEEN TO_TIMESTAMP (‘01/04/2019 07:15:00’, ‘dd/mm/YY HH24:mi:ss’) AND TO_TIMESTAMP (‘01-04-2019 15:15:00’, ‘dd/mm/YY HH24:mi:ss’)),
(SELECT COUNT(*) AS TARDE FROM TSEVENTODESC WHERE ISWEB = ‘N’ AND DTHRSOL BETWEEN TO_TIMESTAMP (‘01/04/2019 15:15:00’, ‘dd/mm/YY HH24:mi:ss’) AND TO_TIMESTAMP (‘01-04-2019 23:15:00’, ‘dd/mm/YY HH24:mi:ss’)),
(SELECT COUNT(*) AS MADRUGADA FROM TSEVENTODESC WHERE ISWEB = ‘N’ AND DTHRSOL BETWEEN TO_TIMESTAMP (‘31/03/2019 23:15:00’, ‘dd/mm/YY HH24:mi:ss’) AND TO_TIMESTAMP (‘01-04-2019 07:15:00’, ‘dd/mm/YY HH24:mi:ss’))
UNION
SELECT * FROM
(SELECT 
2 AS ORDEM, -- campo "virtual" de ordem
COUNT(*) AS MANHA FROM TSEVENTODESC WHERE ISWEB = ‘N’ AND DTHRSOL BETWEEN TO_TIMESTAMP (‘02/04/2019 07:15:00’, ‘dd/mm/YY HH24:mi:ss’) AND TO_TIMESTAMP (‘02-04-2019 15:15:00’, ‘dd/mm/YY HH24:mi:ss’)),
(SELECT COUNT(*) AS TARDE FROM TSEVENTODESC WHERE ISWEB = ‘N’ AND DTHRSOL BETWEEN TO_TIMESTAMP (‘02/04/2019 15:15:00’, ‘dd/mm/YY HH24:mi:ss’) AND TO_TIMESTAMP (‘02-04-2019 23:15:00’, ‘dd/mm/YY HH24:mi:ss’)),
(SELECT COUNT(*) AS MADRUGADA FROM TSEVENTODESC WHERE ISWEB = ‘N’ AND DTHRSOL BETWEEN TO_TIMESTAMP (‘01/04/2019 23:15:00’, ‘dd/mm/YY HH24:mi:ss’) AND TO_TIMESTAMP (‘02-04-2019 07:15:00’, ‘dd/mm/YY HH24:mi:ss’))
UNION
SELECT * FROM
(SELECT 
3 AS ORDEM, -- campo "virtual" de ordem
COUNT() AS MANHA FROM TSEVENTODESC WHERE ISWEB = ‘N’ AND DTHRSOL BETWEEN TO_TIMESTAMP (‘03/04/2019 07:15:00’, ‘dd/mm/YY HH24:mi:ss’) AND TO_TIMESTAMP (‘03-04-2019 15:15:00’, ‘dd/mm/YY HH24:mi:ss’)),
(SELECT COUNT(*) AS TARDE FROM TSEVENTODESC WHERE ISWEB = ‘N’ AND DTHRSOL BETWEEN TO_TIMESTAMP (‘03/04/2019 15:15:00’, ‘dd/mm/YY HH24:mi:ss’) AND TO_TIMESTAMP (‘03-04-2019 23:15:00’, ‘dd/mm/YY HH24:mi:ss’)),
(SELECT COUNT(*) AS MADRUGADA FROM TSEVENTODESC WHERE ISWEB = ‘N’ AND DTHRSOL BETWEEN TO_TIMESTAMP (‘02/04/2019 23:15:00’, ‘dd/mm/YY HH24:mi:ss’) AND TO_TIMESTAMP (‘03-04-2019 07:15:00’, ‘dd/mm/YY HH24:mi:ss’))
ORDER BY ORDEM

Note que cada dia tem um campo virtual de ordem, que é usado no order by fora da seleção (fora dos unions).

Outra opção seria criar uma função PL/SQL para te retornar qual o período de uma determinada data, assim evitando todo esse malabarismo de counts.

Abraço.

D

Entendi, vou tentar aqui, pois estes sqls são montados em tempo de execução, conforme o período selecionado de datas.
Desde já agradeço sua atenção.

Criado 18 de abril de 2019
Ultima resposta 22 de abr. de 2019
Respostas 4
Participantes 2