2012-09-13 69 views
5

使用Microsoft SQL Server管理器2008.SQL存储过程将参数传递到“order by”

使存储过程“最终”选择帕累托列表中的前10位。但我也想一遍再次运行此找到底部10

现在,而不是复制的查询,我想看看是否有一个参数传递到这将改变查询方式从asc到desc的顺序。

有没有办法做到这一点,将节省我从复制代码?

CREATE PROCEDURE [dbo].[TopVRM] 
@orderby varchar(255) 
AS 
SELECT Peroid1.Pareto FROM dbo.Peroid1 
GROUP by Pareto ORDER by Pareto @orderby 
+0

什么数据类型是“帕累托”? – podiluska

回答

7

只有稍微傻:

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个结果,则与当前计划不同,您不会得到重复的结果。

+0

优秀的回复,感谢您的帮助,作品非常好 – lemunk

+0

@Damien_The_Unbeliever你为什么说这是“有点傻”? – BritishDeveloper

1

尝试:

CREATE PROCEDURE [dbo].[TopVRM] 
(@orderby varchar(255) 
AS 
IF @orderby='asc' 
SELECT Peroid1.Pareto FROM dbo.Peroid1 
GROUP by Pareto ORDER by Pareto asc 
ELSE 
SELECT Peroid1.Pareto FROM dbo.Peroid1 
GROUP by Pareto ORDER by Pareto desc 
相关问题