2012-09-13 27 views
5

Sử dụng trình quản lý máy chủ Microsoft SQL 2008.Tham số truyền tải thủ tục lưu trữ SQL thành "thứ tự"

Thực hiện thủ tục được lưu trữ "cuối cùng" chọn 10 hàng đầu trong danh sách Pareto. Nhưng tôi cũng muốn chạy lại lần nữa để tìm phần dưới cùng 10.

Bây giờ, thay vì lặp lại truy vấn một lần nữa, tôi đang cố gắng xem có cách nào chuyển một tham số vào truy vấn sẽ thay đổi không thứ tự từ asc đến desc.

Có cách nào để thực hiện việc này sẽ giúp tôi không bị sao chép mã không?

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

Loại dữ liệu nào là "Pareto"? – podiluska

Trả lời

7

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.

+0

trả lời tuyệt vời, cảm ơn sự giúp đỡ, hoạt động rất độc đáo – lemunk

+0

@Damien_The_Unbeliever tại sao bạn nói điều này là "hơi ngớ ngẩn"? – BritishDeveloper

1

thử:

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 
Các vấn đề liên quan