2012-09-13 39 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 
相關問題