只有稍微傻:
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