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.
¿Qué tipo de datos es "Pareto"? – podiluska