少しばかげているだけで:
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
2番目の並べ替え条件を式に厳密に入れる必要はまったくありませんCASE
(*)。Pareto
数値の場合は、そのままにすることもできますCASE WHEN @orderby='ASC' THEN 1 ELSE -1 END * Pareto
(*) 2 番目の並べ替え条件は、最初の並べ替え条件で 2 つの行が等しいと見なされた場合にのみ効果があります。これは、両方の行が同じPareto値を持っている場合 (つまり、逆の並べ替えでも等しいと見なされる)、または最初のCASE
式が s を返すNULL
ため (そう@orderby
ではない'ASC'
ため、並べ替えを実行したい場合) のいずれかですDESC
。
また、2 つの呼び出しを行うのではなく、両方の結果セットを一度に取得することを検討することもできます。
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
これにより、上位 10 件と下位 10 件が上から順に表示されます。ただし、結果が合計で 20 件未満の場合、現在のプランとは異なり、重複することはありません。