我想在某些条件下按折扣对产品进行分类
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
但它会引发错误 - 我如何按折扣排序?
答案 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
另外,如果您需要动态更改列的ASC
或DESC
,则可以使用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