12

我想在特定条件下按折扣对产品进行排序

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

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

4

3 回答 3

21

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

此外,由于您似乎只想CASE处理单个变量,因此可以将@OrderByout 移到 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 在这里

顺便说一句,如果您需要动态更改列的ASCDESC,您可以通过乘以 -1来使用这样的技巧。

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

于 2013-06-05T10:14:00.190 回答
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 链接请记住 - 指定在 SELECT 语句中返回的列上使用的排序顺序。希望能帮助到你。

于 2013-06-05T10:06:57.230 回答
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
于 2013-06-05T10:16:34.997 回答