2012-09-13 10 views
5

el Administrador de servidores de Microsoft SQL 2008.SQL en "ordenar por"

Haciendo un procedimiento almacenado que "con el tiempo", seleccione el top 10 en la lista de Pareto. Pero también me gustaría ejecutar esto de nuevo para encontrar el fondo 10.

Ahora, en lugar de repetir la consulta de nuevo, estoy tratando de ver si hay una manera de pasar un parámetro en la consulta que cambiará el orden de asc a desc.

¿Hay alguna manera de hacer esto que me salve de replicar el código?

CREATE PROCEDURE [dbo].[TopVRM] 
@orderby varchar(255) 
AS 
SELECT Peroid1.Pareto FROM dbo.Peroid1 
GROUP by Pareto ORDER by Pareto @orderby 
+0

¿Qué tipo de datos es "Pareto"? – podiluska

Respuesta

7

Sólo siendo un poco tonta:

CREATE PROCEDURE [dbo].[TopVRM] 
@orderby varchar(255) 
AS 
SELECT Peroid1.Pareto FROM dbo.Peroid1 
GROUP by Pareto 
ORDER by CASE WHEN @orderby='ASC' THEN Pareto END, 
     CASE WHEN @orderby='DESC' THEN Pareto END DESC 

No hace estrictamente necesario poner la segunda condición de clasificación en una expresión CASE en absoluto (*), y si Pareto es numérico, puede decidir simplemente hacer CASE WHEN @orderby='ASC' THEN 1 ELSE -1 END * Pareto

(*) La segunda condición de ordenación solo tiene un efecto cuando la primera condición de clasificación considera que dos filas son iguales. Esto es, ya sea cuando ambas filas tienen el mismo Pareto valor (por lo que el tipo inverso también las considerarían iguales), de CASE porque la primera expresión está volviendo NULL s (por lo que no es @orderby'ASC', por lo que queremos realizar la DESC . Ordenar


también podría considerar la recuperación de ambos conjuntos de resultados de una sola vez, en lugar de hacer dos llamadas:

CREATE PROCEDURE [dbo].[TopVRM] 
@orderby varchar(255) 
AS 

SELECT * FROM (
    SELECT 
     *, 
     ROW_NUMBER() OVER (ORDER BY Pareto) as rn1, 
     ROW_NUMBER() OVER (ORDER BY Pareto DESC) as rn2 
    FROM (
     SELECT Peroid1.Pareto 
     FROM dbo.Peroid1 
     GROUP by Pareto 
    ) t 
) t2 
WHERE rn1 between 1 and 10 or rn2 between 1 and 10 
ORDER BY rn1 

Esto le dará los 10 superior y la parte inferior 10, con el fin de arriba a abajo. Pero si hay menos de 20 resultados en total, no obtendrá duplicados, a diferencia de su plan actual.

+0

excelente respuesta, gracias por la ayuda, funciona muy bien – lemunk

+0

@Damien_The_Unbeliever ¿por qué dices que esto es "un poco tonto"? – BritishDeveloper

1

intento:

CREATE PROCEDURE [dbo].[TopVRM] 
(@orderby varchar(255) 
AS 
IF @orderby='asc' 
SELECT Peroid1.Pareto FROM dbo.Peroid1 
GROUP by Pareto ORDER by Pareto asc 
ELSE 
SELECT Peroid1.Pareto FROM dbo.Peroid1 
GROUP by Pareto ORDER by Pareto desc