Sql Order By ...使用`Case When`进行不同的升序,降序和自定义订单

时间:2013-06-05 09:57:14

标签: sql sql-server

我想在某些条件下按折扣对产品进行分类

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 (100-((table.price/table.oldprice)*100) as discount END ASC

但它会引发错误 - 我如何按折扣排序?

3 个答案:

答案 0 :(得分:21)

有很多问题,例如您不能在订单中为计算字段设置别名,并且您需要转义表名,修复cae并计算括号。

此外,由于您似乎只想对单个变量CASE,因此可以将@OrderBy移到CASE的顶部,如下所示:

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

另外,如果您需要动态更改列的ASCDESC,则可以使用this之类的黑客乘以-1。

(另请注意,ORDER BY CASE ... END ASC, CASE ... END ASC会设置第一个和第二个排序...这似乎没有意义,因为@OrderBy只能有一个值)

答案 1 :(得分:4)

在我看来,你需要类似的东西

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

如果你没有库存,那么你就无法对此进行评论。请阅读此Microsoft Link请记住 - 指定在SELECT语句中返回的列上使用的排序顺序。 希望它有所帮助。

答案 2 :(得分:3)

不要计算ORDER BY条款中的折扣,而是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