Tylko będąc nieco głupie:
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
ty nie ściśle potrzeby umieszczania drugiego warunku sortowania w wyrażeniu CASE
w ogóle (*), a jeśli numer Pareto
jest numeryczny, możesz zdecydować, że chcesz po prostu wykonać CASE WHEN @orderby='ASC' THEN 1 ELSE -1 END * Pareto
(*) Drugi warunek sortowania działa tylko wtedy, gdy pierwszy warunek sortowania traktuje dwa wiersze jako równe. Jest to możliwe, gdy oba wiersze mają taką samą wartość Pareto Pareto (więc sortowanie odwrotne również uznałoby je za równe), ponieważ pierwsze wyrażenie CASE
powraca NULL
s (więc @orderby
nie jest 'ASC'
, więc chcemy wykonać DESC
. sort
można też rozważyć zdobycie obu zestawów wyników za jednym razem, zamiast robić dwa połączenia:
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
to daje górną 10 i dolną 10, w celu od góry do dołu. Ale jeśli w sumie jest mniej niż 20 wyników, w przeciwieństwie do obecnego planu nie otrzymasz duplikatów.
Jakim typem danych jest "Pareto"? – podiluska