【发布时间】:2019-07-16 10:41:24
【问题描述】:
在此查询中,我尝试选择所有不同的(字母数字)机器名称并正确排序它们(1,2,5,10,15 而不是 1,10,15,2,5)。当 INNER JOIN 没有加入 LocalName 时,CASE 语句被证明是有效的,所以我怀疑这就是问题所在。
SELECT DISTINCT MCGroup, VisionMachinePerformance.MCSAP, ZAssetRegister.LocalName
FROM [VisionMachinePerformance] INNER JOIN ZAssetRegister ON VisionMachinePerformance.MCSAP=ZAssetRegister.SAP_Number
ORDER BY
CASE WHEN PATINDEX('%[0-9]%',LocalName) > 1 THEN
LEFT(LocalName,PATINDEX('%[0-9]%',LocalName)-1)
ELSE LocalName END ,
CASE WHEN PATINDEX('%[0-9]%',LocalName) > 1 THEN
CAST(SUBSTRING(LocalName,PATINDEX('%[0-9]%',LocalName),LEN(LocalName)) as float)
ELSE NULL END
报告的错误是“SQL 错误 (145):如果指定了 SELECT DISTINCT,则 ORDER BY 项必须出现在选择列表中”。
我尝试将 CASE 语句中的所有引用更改为 ZAssetRegister.LocalName 和 VisionMachinePerformance.LocalName,但没有成功。
删除所有 CASE 语句并按 LocalName 排序确实有效,但上述顺序错误 (1,10,15,2,5)。
有人可以建议如何进行这项工作吗?
TIA!
【问题讨论】:
-
错误在这里告诉你问题;您需要在
SELECT中包含ORDER BY中的表达式,或者不使用DISTINCT。或者,您可以根据从 CTE 返回的数据将SELECT移动到 CTE, and then do theORDER BY`。 -
对不起@Larnu 我不关注,你能详细说明一下吗?我只是尝试将 CASE 语句复制到 SELECT 中,但这没有用。在这种情况下,我需要 DISTINCT,因为我正在构建一个唯一的机器列表,稍后我将在这些机器上执行单独的查询
标签: sql sql-server sql-order-by