PDA

Ver la Versión Completa : Order by anidados


lina maria
04-01-2010, 16:12:32
Hola compañeros, yo de nuevo con otra de mis dudas, la cosa va asi tengo una tabla con dos campos TIMESTAMP, uno de ellos (fecha1) es not null, mientras que el otro (fecha2) si puede estar en null, mi problema es el siguiente, necesito ordenar todos los datos de la siguiente forma, en primer lugar deben estar los datos que su fecha2 sea null, estos datos deben estar ordenados de acuerdo a la fecha almacenada en fecha1, despues de estos campos tiene que aparecer los datos cuya fecha2 sea diferente de null igualmente ordenados por fecha1, se me ocurrio algo asi como un order by anidado (por eso el titulo del mensaje) pero no he dado como. Agradesco cualquier ayuda o guia que me puedan brindar muchas gracias y estamos hablando, besos y abrazos.

P.D. utilizo delphi 7 y postgreSQL 8.3, los resultados los muestro en un dbgrid

afunez2007
04-01-2010, 17:17:45
Hola

No se si en postgre sql funcione pero en mssql, es asi:

SELECT *FROM TUTABLA
ORDER BY FECHA2 ASC, FECHA1 ASC


Espero te sirva

Saludos

lina maria
04-01-2010, 18:00:14
Hola, muchas gracias por tu respuesta, te cuento que esa solucion ya la habia contemplado, pero al ejecutarla vi un problema, con esta solucion el me ordena primero por el primer campo valga la redundancia osea en este caso fecha1 y despues para cada uno de ellos me ordena fecha2 osea me explico mejor con un ejemplo, tengo 8 registros cada uno de ellos con diferente fecha2 del 1 al 10 y la mitad de ellos con fecha1 15 y la otra mitad con fecha1 20, entonces esa instruccion primero me "agrupa" los de fecha1 15 ordenados por la fecha2 y despues los otros 5 ordenados por la fecha dos osea, a eso le añado otros dos campos con fecha1 vacia, esta instruccion me los ordenaria asi

1 --
3 --
5 15
7 15
9 15
10 15
2 20
4 20
6 20
8 20

Pero lo que yo necesito es que me los ordene asi
1 --
3 --
2 20
4 20
5 15
6 20
7 15
8 20
9 15
10 15

La primera fecha solo tengo en cuenta dos escenarios que sea null y que sea diferente de null, el resto de la ordenacion la hago por la segunda fecha.

No se si logre explicarme bien, es un poco enrredado pero espero que me hayan entendido.
Muchas gracias por tu colaboracion y por tu tiempo y espero que me puedas ayudar con este nuevo escenario.
Muchas gracias a todos ojala puedan ayudarme.
Besos y abrazos

afunez2007
04-01-2010, 18:59:26
Me podrias inidicar cual es la estructura de la tabla, que hay primero?, hay algun autonumerado, indices, etc.
Los numeros enteros que ilustras en tu mensaje anterior corresponden a fechas dentro de un mismo mes??

Aun es confuso asi como lo planteas, los campos fecha1 y fecha2, son de tipo datetime?? o se guardan fecha y hora?

Saludos

lina maria
04-01-2010, 19:19:59
CREATE TABLE "X"
"i_cod_1" NUMERIC NOT NULL,
"i_cod_2" NUMERIC NOT NULL,
"FECHA2" TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL,
"i_cod_3" NUMERIC,
"i_cod_4" NUMERIC,
"FECHA1" TIMESTAMP(0) WITHOUT TIME ZONE


esa es la estructura de mi tabla, las dos fechas son TIMESTAMP y si esos numeros que puse son fechas dentro de un mismo mes, la unica forma que he encontrado hasta ahora es haces dos consultas que serian mas o menos asi

select * from x
where fecha1 IS NULL
ORDER BY fecha2 DESC';
select * from x
where fecha1 IS NOT NULL
ORDER BY fecha2 DESC';

La suma de lo que hacen esas dos consultas es lo que necesito, pero en una sola consulta, no he podido dar como.
De nuevo mil gracias por tu ayuda y tiempo invertido en mi problema, te estoy muy agradecida y ojala puedas seguir ayudandome ;).
Chao besos y abrazos

Casimiro Notevi
04-01-2010, 19:53:20
Si primero buscas todos los fecha1 nulos, ordenados por fecha2:

select * from x
where fecha1 IS NULL
ORDER BY fecha2 DESC;
Y luego buscas todos los fecha1 no nulos, ordenados por fecha2:

select * from x
where fecha1 IS NOT NULL
ORDER BY fecha2 DESC;
Entonces, lo que estás buscando es todos los fecha1 (sean nulos o no) ordenados por fecha2.

Pero, según veo en la tabla, fecha1 es 'not null', por lo tanto... no puede haber nulos.

Seguramente me he confundido, ¿puedes aclararlo?


edito: fecha2 es not null, es que lo que he escrito antes es lo que has escrito tú en el primer post.... ya estoy mareado :)

lina maria
04-01-2010, 20:05:57
Hola sisisi, que pena contigo la verdad yo tambien estoy bastante mareada con este asunto :(, en mitad del foro cambie los nombres, pero bueno el que puede ser null es fecha1, tal como esta en la estructura de la tabla y en los querys, y fecha2 es not null, entonces si tienes razon yo busco todos los fecha1 sean o no nulos ordenados por fecha2 PERO primero me debe ordenar los que son nulos y despues los que son no nulos, y es aqui donde tengo el problema que primero obtenga los no nulos y despues el resto.

Muchas gracias por tu atencion y colaboracion y cualquier otra cosa que necesites que aclare aca estare pendiente.

Gracias besos y abrazos

afunez2007
04-01-2010, 20:31:04
Prueba con esto:

SELECT i_cod_1, i_cod_2, FECHA2, i_cod_3, i_cod_4, FECHA1
FROM X
WHERE (FECHA1 IS NULL)
UNION ALL
SELECT i_cod_1, i_cod_2, FECHA2, i_cod_3, i_cod_4, FECHA1
FROM TUTABLA AS X_1
WHERE (FECHA1 IS NOT NULL)


Esto funciona por lo menos en sql server, esto es lo que resulta:

NULL NULL 01/01/2009 12:00:00 a.m. NULL NULL NULL
NULL NULL 03/01/2009 12:00:00 a.m. NULL NULL NULL
NULL NULL 02/01/2009 12:00:00 a.m. NULL NULL 20/01/2009 12:00:00 a.m.
NULL NULL 04/01/2009 12:00:00 a.m. NULL NULL 20/01/2009 12:00:00 a.m.
NULL NULL 05/01/2009 12:00:00 a.m. NULL NULL 15/01/2009 12:00:00 a.m.
NULL NULL 06/01/2009 12:00:00 a.m. NULL NULL 20/01/2009 12:00:00 a.m.
NULL NULL 07/01/2009 12:00:00 a.m. NULL NULL 15/01/2009 12:00:00 a.m.
NULL NULL 08/01/2009 12:00:00 a.m. NULL NULL 20/01/2009 12:00:00 a.m.
NULL NULL 09/01/2009 12:00:00 a.m. NULL NULL 15/01/2009 12:00:00 a.m.
NULL NULL 10/01/2009 12:00:00 a.m. NULL NULL 15/01/2009 12:00:00 a.m.

Saludos

Casimiro Notevi
04-01-2010, 20:34:03
Seguramente puedas hacerlo con "union", algo parecido a esto:


select a.*
from tabla a
where a.fecha1 is null
union
select b.*
from tabla b
where b.fecha1 is not null
order by 1 <-- el número de campo (creo que no acepta nombres en este caso)


edito: se me adelantó afunez2007 :)

lina maria
05-01-2010, 13:28:15
Hola, quiero empezar agradeciendoles a los por la ayuda y el tiempo invertido a la solucion de mi problema, les cuento que casi es la solucion, la probe las primeras dos veces y funciono a la perfeccion, pero al modificar unos datos, unas fechas me lo ordena asi

4/1/2010 00:00:00 Null
3/1/2010 00:00:00 Null
2/1/2010 00:00:00 3/1/2010 00:00:00
2/1/2010 00:00:00 Null
1/1/2010 00:00:00 4/1/2010 00:00:00
31/12/2009 00:00:00 31/12/2009 00:00:00

De todos modos ya estoy mas cerca de la solucion gracias a ustedes, voy a segir trabajandole y cualquier otra ayuda sera muy bien recibida.
Muy agradecida por toda la ayuda, besos y abrazos.

lina maria
07-01-2010, 16:29:09
Hola a todos, al fin ya pude solucionar mi problema, pongo la solucion por si a alguno le puede interesar, encontre dos soluciones la primera es asi
select fecha1, fecha2
from tablaX
order by
(case fecha1 is null then fecha1 else
fecha2 end) desc, fecha2 DESC

la segunda es asi
select fecha1, fecha2
case when fecha1 is null then 0 else 1 end as ordem
from tablaX
ORDER BY
ordem, fecha2 DESC

Muchas gracias por su colaboracion y el tiempo invertido a la solucion de mi problema.

Muchas gracias, chao besos y abrazos