只是有点傻:
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
您根本不需要将第二个排序条件放在CASE
表达式中(*),如果Pareto
是数字,您可以决定只做CASE WHEN @orderby='ASC' THEN 1 ELSE -1 END * Pareto
(*) 只有当第一个排序条件认为两行相等时,第二个排序条件才有效。这是当两行具有相同的Pareto值时(因此反向排序也会认为它们相等),或者因为第一个CASE
表达式返回NULL
s (所以@orderby
is not 'ASC'
,所以我们想要执行DESC
排序。
您可能还想考虑一次检索两个结果集,而不是进行两次调用:
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 个结果,您将不会得到重复,这与您当前的计划不同。