Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Order by anidados (https://www.clubdelphi.com/foros/showthread.php?t=65660)

lina maria 04-01-2010 16:12:32

Order by anidados
 
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:
Código SQL [-]
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

Código SQL [-]
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

Código SQL [-]
select * from x 
where fecha1 IS NULL
  ORDER BY fecha2 DESC';
Código SQL [-]
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:

Código:

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

Y luego buscas todos los fecha1 no nulos, ordenados por fecha2:

Código:

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:
Código SQL [-]
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:

Código:

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
Código SQL [-]
select fecha1, fecha2
from tablaX
order by
(case fecha1 is null then fecha1 else
fecha2 end) desc, fecha2 DESC

la segunda es asi
Código SQL [-]
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


La franja horaria es GMT +2. Ahora son las 18:02:23.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi