2013-06-05 36 views
12

Tôi muốn sắp xếp sản phẩm bằng cách giảm giá với điều kiện nhất địnhSql Sắp xếp theo ... sử dụng `Trường hợp When` cho Tăng dần khác nhau, giảm dần, và Custom Orders

ORDER BY 
    CASE WHEN @OrderBy = 0 
    THEN table.id END ASC, 
    CASE WHEN @Orderby = 2 
    THEN table.id END ASC, 

tôi muốn làm một cái gì đó giống như dưới đây khi tôi don không có cột giảm giá trong bảng

CASE WHEN @OrderBy = 4 
THEN (100-((table.price/table.oldprice)*100) as discount END ASC 

nhưng nó ném lỗi - làm thế nào tôi có thể sắp xếp theo chiết khấu?

+3

lỗi gì là nó ném? –

+0

Xóa 'dưới dạng giảm giá'. Nó ở một vị trí sai hoàn toàn (bên trong biểu thức), và bạn không thể bí danh một biểu thức trong 'thứ tự bởi' vì nó không có ý nghĩa. –

+0

cú pháp không chính xác gần từ là –

Trả lời

21

Có một số vấn đề, ví dụ: Bạn không thể đặt biệt hiệu cho trường tính toán theo thứ tự và bạn cần phải thoát khỏi tên bảng của mình, sửa số cae và đếm dấu ngoặc đơn.

Ngoài ra, vì có vẻ như bạn chỉ muốn CASE trên một biến duy nhất, bạn có thể di chuyển @OrderBy ra phía trên cùng của CASE, như vậy:

SELECT * from [table] 
ORDER BY 
    CASE @OrderBy 
     WHEN 0 
      THEN [table].id -- ASC 
     WHEN 2 
      THEN [table].id * -1 -- DESC 
    ---I want to do something like below as I don't have discount column in table 
     WHEN 4 
      THEN (100-([table].price/[table].oldprice)*100) 
    END 

SqlFiddle Here

Là một sang một bên , nếu bạn cần thay đổi động ASC hoặc DESC của một cột, bạn có thể sử dụng lệnh hack như this bằng cách nhân với -1.

(Cũng lưu ý rằng ORDER BY CASE ... END ASC, CASE ... END ASC sẽ thiết lập các orderings đầu tiên và sau đó thứ hai ... này dường như không có ý nghĩa cho rằng @OrderBy chỉ có thể có một giá trị duy nhất)

+0

Cảm ơn StuartLc Điều đó đã giải quyết được vấn đề của tôi –

+0

Và thực sự tôi đã sử dụng asc và desc theo thứ tự của CASE WHEN @OrderBy = 20 \t \t THEN (100- (table.price/table.oldprice) * 100) END DESC, –

4

Dường như với tôi bạn cần một cái gì đó tương tự như sau

select * from TableName where someCondition >100 
    order by 
    case when @OrderBy = 'AirlineService' 
     then AirlineService END desc, 
    case when @OrderBy = 'SomeMore' 
     then MyOtherColumn end 
GO 

Nếu bạn không có một coulmn thì bạn không thể sắp xếp với điều đó. Vui lòng đọc số này Microsoft Link Xin lưu ý - chỉ định thứ tự sắp xếp được sử dụng trên các cột được trả về trong câu lệnh SELECT. Hy vọng điều đó sẽ hữu ích.

+0

Cảm ơn bạn đã hướng dẫn ur –

+0

Bạn được chào đón, một điều nhỏ nữa, tên cột mà bạn sẽ chỉ định theo thứ tự sẽ luôn được truy xuất từ ​​ngay cả cột đó không được chỉ định trong danh sách lựa chọn. Bạn có thể kiểm tra hành vi này bằng kế hoạch thực hiện. – Microtechie

+0

http://www.sqlfiddle.com/#!3/41859/1 Bởi (StuatLc) giải quyết vấn đề của tôi, nhờ hỗ trợ ur –

3

Đừng tính toán số tiền chiết khấu trong ORDER BY khoản nhưng trong SELECT

SELECT *, (100-(table.price/table.oldprice))*100 as discount 
FROM table 

...

ORDER BY 
CASE WHEN @OrderBy = 0 
THEN table.id END ASC, 
CASE when @orderby=2 
THEN table.id END ASC, 
CASE WHEN @OrderBy = 4 
THEN discount END ASC 
+0

Thanx tôi sẽ kiểm tra –

+0

Hazaart Trên thực tế chúng tôi có thể tính toán chiết khấu theo thứ tự, Giải pháp trên đã hoạt động (StuartLC) cho tôi Bạn có thể xem demo trên http: //www.sqlfiddle .com/#! 3/41859/1 –

Các vấn đề liên quan