Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql订单依据。。。对不同的升序、降序和自定义顺序使用“Case-When”_Sql_Sql Server - Fatal编程技术网

Sql订单依据。。。对不同的升序、降序和自定义顺序使用“Case-When”

Sql订单依据。。。对不同的升序、降序和自定义顺序使用“Case-When”,sql,sql-server,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 但

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

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

但它抛出了一个错误-我如何按折扣排序?

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

select * from TableName where someCondition >100
  order by
    case when @OrderBy = 'AirlineService'
      then AirlineService END desc,
    case when  @OrderBy = 'SomeMore'
      then  MyOtherColumn  end
GO
如果你没有coulmn,那么你就不能处理它。请阅读此内容请记住-指定在SELECT语句中返回的列上使用的排序顺序。
希望有帮助。

有很多问题,例如,您不能在order by中为计算字段别名,您需要转义表名,修复
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
,可以使用hack-like乘以-1


(还要注意,
OrderBy CASE…END ASC,CASE…END ASC
将设置第一个和第二个订单…考虑到
@OrderBy
只能有一个值,这似乎没有意义)

不要在
ORDER BY
子句中计算折扣,而是在
中选择

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


它抛出了什么错误?将
作为折扣删除
。它完全位于错误的位置(表达式内部),您不能按
的顺序对表达式进行别名,因为这没有任何意义。asI作为折扣删除了单词附近的不正确语法,但在括号结尾处出现了错误。欢迎您,还有一件小事,即使选择列表中未指定该列,也将始终从中检索将按顺序指定的列名。您可以使用执行计划检查此行为。By(Stuartc)解决了我的问题,感谢您的支持Hazaart实际上我们可以按订单计算折扣,以上解决方案对我有效(StuartLC),您可以查看演示,实际上我已经按案例使用了asc和desc当@OrderBy=20时,然后(100-(table.price/table.oldprice)*100)结束描述,
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