我想添加一个条件,根据派生列的值对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
, rank
和status
。
避免在名称中使用特殊字符。这将包括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列。
在字段名周围使用'
将它们转换为字符串。要么完全去掉引号,要么用"
代替。