Ordenar según criterios

04/08/2008 - 19:15 por David | Informe spam
Microsoft SQL Server 2000

Muy buenas, ¿es posible ordenar bajo ciertas condiciones?, me explico:

SELECT bla, bla, bla, ..., nombre, fecha
FROM bla, bla, bla, ...
WHERE bla, bla, bla, ...
ORDER BY "si un campo de la tabla existen ciertos valores ordena por ese
campo en otro caso por FECHA"

Imaginemos que ese campo es NOMBRE y si existen campos NOMBRE con valores
NULL ordenar por ese campo en caso contrario por el CAMPO FECHA

Preguntas similare

Leer las respuestas

#1 Jesús López
05/08/2008 - 09:16 | Informe spam
No tengo muy claro como tiene que ser el orden, ¿Podrías poner un ejemplo
con datos?

De todas maneras, un orden un poco especial se puede conseguir con case:


SELECT <lista de selección>
FROM <tabla>
WHERE <condición>
ORDER BY CASE WHEN <condición1> THEN <expresión 1> . ELSE <expresión n>
END

Saludos:

Jesús López
www.solidq.com



"David" escribió en el mensaje
news:%239b5$
Microsoft SQL Server 2000

Muy buenas, ¿es posible ordenar bajo ciertas condiciones?, me explico:

SELECT bla, bla, bla, ..., nombre, fecha
FROM bla, bla, bla, ...
WHERE bla, bla, bla, ...
ORDER BY "si un campo de la tabla existen ciertos valores ordena por ese
campo en otro caso por FECHA"

Imaginemos que ese campo es NOMBRE y si existen campos NOMBRE con valores
NULL ordenar por ese campo en caso contrario por el CAMPO FECHA



Respuesta Responder a este mensaje
#2 David
05/08/2008 - 14:05 | Informe spam
Mil gracias, esto era lo que necesitaba.

CREATE PROC MuestraDatos

AS

SET NOCOUNT ON

SELECT bla, bla,

FROM Tabla

ORDER BY
CASE
WHEN (SELECT COUNT([id]) FROM Tabla WHERE Campo1 IS NULL) > 0 THEN Campo1
ELSE OtroCampo
END


SET NOCOUNT OFF

RETURN (0)
GO
Respuesta Responder a este mensaje
#3 Jesús López
05/08/2008 - 14:26 | Informe spam
También lo podrías haber hecho de esta otra manera, y probablemente sea más
eficiente:

CREATE PROC MuestraDatos
AS
SET NOCOUNT ON

IF EXISTS (SELECT * FROM Tabla WHERE Campo1 IS NULL)
BEGIN

SELECT bla, bla,
FROM Tabla
ORDER BY Campo1

END
ELSE
BEGIN

SELECT bla, bla,
FROM Tabla
ORDER BY OtroCampo

END
SET NOCOUNT OFF

RETURN (0)
GO



"David" escribió en el mensaje
news:ecu$
Mil gracias, esto era lo que necesitaba.

CREATE PROC MuestraDatos

AS

SET NOCOUNT ON

SELECT bla, bla,

FROM Tabla

ORDER BY
CASE
WHEN (SELECT COUNT([id]) FROM Tabla WHERE Campo1 IS NULL) > 0 THEN Campo1
ELSE OtroCampo
END


SET NOCOUNT OFF

RETURN (0)
GO


Respuesta Responder a este mensaje
#4 Alejandro Mesa
05/08/2008 - 16:07 | Informe spam
David,

Quiero señalar dos cosas:

1 - No necesitas contar para probar existencia. Puedes usar el operador
EXISTS, y de seguro tendras mejor desempeño.

CASE
WHEN EXISTS (SELECT 1 FROM Tabla WHERE Campo1 IS NULL) THEN Campo1
ELSE Campo2
END

2 - Para usar este metodo, usando la fuincion CASE, las columnas deben ser
de el mismo tipo de dato, o que se puedan convertir implicitamente de un tipo
hacia el otro, de llo contrario tendras que hacer la conversion
explicitamente o si no te dara error. El tipo de dato de la funcion CASE, es
el tipo de mayor precedencia entre los tipos que aparecen en todas las partes
THEN / ELSE. Este problema se puede arreglar haciendo una conversion
explicita, pero ten en cuenta que ordenar por valores enteros no es lo mismo
que ordenar por caracteres, y puede ser que la ordenacion final no sea la
esperada.

Ejemplo:

declare @t table (
c1 int,
c2 varchar(15)
)

insert into @t
select 1, 'FY2008'

select
c1, c2
from
@t
order by
case
when exists (
select 1
from @t
where c1 is null
) then c1
else
c2
end

select
c1, c2
from
@t
order by
case
when exists (
select 1
from @t
where c1 is null
) then convert(varchar(15), c1)
else
c2
end
GO


Ten en cuenta el comentario hecho por Jesús.

AMB


"David" wrote:

Mil gracias, esto era lo que necesitaba.

CREATE PROC MuestraDatos

AS

SET NOCOUNT ON

SELECT bla, bla,

FROM Tabla

ORDER BY
CASE
WHEN (SELECT COUNT([id]) FROM Tabla WHERE Campo1 IS NULL) > 0 THEN Campo1
ELSE OtroCampo
END


SET NOCOUNT OFF

RETURN (0)
GO




Respuesta Responder a este mensaje
#5 David
05/08/2008 - 17:30 | Informe spam
De nuevo mil millones de gracias.

Como comentario tanto campo1 como campo2 son del mismo tipo (fecha)
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida