只有稍微傻:
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
(*)第二个排序条件仅在第一个排序条件认为两行相等时才起作用。这既可以当两行具有相同的帕累托值(所以逆向排序也将考虑他们平等),因为第一个CASE
表达式返回NULL
S的(所以@orderby
不'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个结果,则与当前计划不同,您不会得到重复的结果。
什么数据类型是“帕累托”? – podiluska