使用基于派生列的条件(大小写)按SQL数据排序



我想添加一个条件,根据派生列的值对SQL数据进行排序,如下所示:

SELECT DISTINCT sp.ID
    , sp.Status
    , sp.Rank
    , sp.Price
    , sp.SalePrice
    , sp.Width
    , sp.Height
    , sp.QOH
    , (sp.SalePrice*sp.QOH) As 'sp.Value'
    , (sp.Price*sp.QOH) As 'sp.StandardValue'
FROM table 
WHERE -- Conditions
ORDER BY
  CASE WHEN 'sp.SalePrice' > 0 THEN 'sp.Value'  END DESC,
  CASE WHEN 'sp.SalePrice' = 0 THEN 'sp.StandardValue'  END DESC

给出这个错误:

留言145,第15层,第1州,第1线
如果指定了select DISTINCT, ORDER BY项必须出现在select列表中。

如果我尝试

ORDER BY
  CASE WHEN sp.SalePrice > 0 THEN (sp.SalePrice*sp.QOH) As "sp.Value"  END DESC,
  CASE WHEN sp.SalePrice = 0 THEN (sp.Price*sp.QOH) As sp.StandardValue" END DESC

给了错误:

关键字'As'附近语法错误。

开始给出相同的select distinct错误,如果我试图从order by clase &只保留乘法部分

我将在下面添加一堆关于一般约定的建议,但至于主要问题,请考虑您试图用这个示例做什么:

My_Table:

id    value
1     1
2     2
3     1

现在,尝试显示不同的value按id排序。应该是哪一个呢?

value
1
2

value
2
1

所以,你要求SQL Server做一些可能不可能或至少不清楚的事情。

现在,关于惯例…也许这只是你在这里张贴的方式,但我会对你的代码提出以下建议:

避免使用保留字和SQL语言字作为名称。这将包括table, rankstatus

避免在名称中使用特殊字符。这将包括sp.value。当然,你可以用带引号的标识符来做,但是一些前端等可能不支持它们,即使SQL支持它们,而且在大多数情况下使用它们并没有真正买到任何东西。

必须对名称加引号时使用加引号的标识符。如果你一定要违反上面两个建议中的一个,使用SQL Server的标准引号标识符,即[]。如果您想引用别名,也可以使用这些(顺便说一句,您不应该通常引用别名)。这有助于避免Mark B指出的问题。

您的CASE语句可以更好地写成一个排序列。此外,在大多数情况下应该包含ELSE,以避免未处理的条件。只要您不能在任何相关列中使用null或负值,这里可能不需要这样做。

CASE
    WHEN sp.SalePrice > 0 THEN (sp.SalePrice*sp.QOH)
    WHEN sp.SalePrice = 0 THEN (sp.Price*sp.QOH)
END

我个人会避免使用表别名(它看起来像你不小心遗漏了你的查询)作为你列别名的一部分。在我看来,这使得它更令人困惑,因为它使它看起来像别名列实际上是表中的一个列。

第二个示例最接近,因为它正确地指定了列。但是,不能按by顺序对列进行别名。

ORDER BY
  CASE WHEN sp.SalePrice > 0 THEN sp.SalePrice*sp.QOH END DESC,
  CASE WHEN sp.SalePrice = 0 THEN sp.Price*sp.QOH END DESC

或者直接使用在结果集中定义的别名:

ORDER BY
  CASE WHEN sp.SalePrice > 0 THEN [sp.Value] END DESC,
  CASE WHEN sp.SalePrice = 0 THEN [sp.StandardValue] END DESC

注意括号[]....这是定义列名所必需的,因为您在别名中使用了带点的名称…否则sp.Value将被认为是sp表中的Value列。

在字段名周围使用'将它们转换为字符串。要么完全去掉引号,要么用"代替。