Ajuda com SQL(UNION X ORDER BY) ORACLE

Bom dia galera do Bem,
Assim, tenho o seguinte SQL:
SELECT * FROM
(SELECT 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 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 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’))

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

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.

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.

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.

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.