Chỉ bằng cách hơi ngớ ngẩn:
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
Bạn không Nghiêm cần phải đặt điều kiện loại thứ hai trong một biểu thức CASE
ở tất cả (*) và nếu Pareto
là số, bạn có thể quyết định chỉ cần CASE WHEN @orderby='ASC' THEN 1 ELSE -1 END * Pareto
(*) Điều kiện sắp xếp thứ hai chỉ có tác dụng khi điều kiện sắp xếp thứ nhất xem xét hai hàng bằng nhau. Đây là một trong hai khi cả hai hàng có cùng một giá trị Pareto (vì vậy loại ngược lại cũng sẽ xem xét chúng bằng nhau), các vì CASE
biểu hiện đầu tiên là trở NULL
s (vì vậy @orderby
không phải là 'ASC'
, vì vậy chúng tôi muốn thực hiện DESC
. sort
bạn cũng có thể muốn xem xét lấy cả hai bộ kết quả trong một đi, chứ không phải làm hai cuộc gọi:
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
này sẽ cung cấp cho bạn top 10 và đáy 10, theo thứ tự từ đầu đến cuối. Nhưng nếu có ít hơn 20 kết quả trong tổng số, bạn sẽ không nhận được bản sao, không giống như kế hoạch hiện tại của bạn.
Nguồn
2012-09-13 13:22:03
Loại dữ liệu nào là "Pareto"? – podiluska