Solo essendo un po 'sciocco:
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
Non lo sai strettamente necessità di mettere la seconda condizione di ordinamento in un'espressione CASE
a tutti (*), e se Pareto
è numerico, si può decidere di fare solo CASE WHEN @orderby='ASC' THEN 1 ELSE -1 END * Pareto
(*) La seconda condizione di ordinamento ha solo un effetto quando la prima condizione di ordinamento considera due righe uguali. Questo è sia quando i due righe hanno lo stesso Pareto valore (pertanto l'ordinamento inverso sarebbe anche considerare uguali), del perché il primo CASE
espressione restituisce NULL
s (così @orderby
non è 'ASC'
, quindi vogliamo eseguire la DESC
. sorta
si potrebbe anche prendere in considerazione il recupero di entrambi i set di risultati in un colpo solo, piuttosto che fare due chiamate:
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
Questo vi darà la top 10 e il fondo 10, al fine da cima a fondo. Ma se ci sono meno di 20 risultati in totale, non otterrai duplicati, a differenza del tuo piano attuale.
fonte
2012-09-13 13:22:03
Quale tipo di dati è "Pareto"? – podiluska