【问题标题】:Sql Order By ... using `Case When` for different Ascending, Descending, and Custom OrdersSql Order By ... 对不同的升序、降序和自定义顺序使用“Case When”
【发布时间】:2013-06-05 09:57:13
【问题描述】:

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

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

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

【问题讨论】:

  • 它抛出了什么错误?
  • 删除as discount。它完全位于错误的位置(在表达式内部),并且您不能为 order by 中的表达式添加别名,因为它没有意义。
  • as 附近的语法不正确
  • 我作为折扣删除,但在接近尾声时给出错误
  • 计算括号。

标签: sql sql-server


【解决方案1】:

有很多问题,例如您不能在 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

SqlFiddle Here

顺便说一句,如果您需要动态更改列的ASCDESC,您可以使用类似this 的hack 乘以-1。

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

【讨论】:

  • 实际上我已经按照 CASE WHEN @OrderBy = 20 THEN (100-(table.price/table.oldprice)*100)END DESC 的顺序使用了 asc 和 desc,
【解决方案2】:

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

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 语句中返回的列上使用的排序顺序。 希望对您有所帮助。

【讨论】:

  • 不客气,还有一件小事,您将按顺序指定的列名将始终从选择列表中未指定的列中检索。您可以使用执行计划检查此行为。
  • sqlfiddle.com/#!3/41859/1 By (StuatLc) 解决了我的问题,感谢您的支持
【解决方案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

【讨论】:

  • Hazaart 实际上我们可以按顺序计算折扣,以上解决方案对我有效(StuartLC's)你可以在sqlfiddle.com/#!3/41859/1查看演示
猜你喜欢
  • 2019-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-12
  • 1970-01-01
  • 1970-01-01
  • 2021-12-06
  • 1970-01-01
相关资源
最近更新 更多