【问题标题】:How to combine CASE statement with Inner Join for Alphanumeric OrderBY如何将 CASE 语句与字母数字 OrderBY 的内部联接结合起来
【发布时间】: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 the ORDER BY`。
  • 对不起@Larnu 我不关注,你能详细说明一下吗?我只是尝试将 CASE 语句复制到 SELECT 中,但这没有用。在这种情况下,我需要 DISTINCT,因为我正在构建一个唯一的机器列表,稍后我将在这些机器上执行单独的查询

标签: sql sql-server sql-order-by


【解决方案1】:

您可以使用子查询将这两个部分分开:

SELECT * FROM (
    SELECT DISTINCT MCGroup, VisionMachinePerformance.MCSAP, ZAssetRegister.LocalName 
    FROM [VisionMachinePerformance]
    INNER JOIN ZAssetRegister ON VisionMachinePerformance.MCSAP=ZAssetRegister.SAP_Number
) DISTINCT_DATA
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

【讨论】:

    猜你喜欢
    • 2020-09-09
    • 2022-12-06
    • 1970-01-01
    • 1970-01-01
    • 2015-05-18
    • 2012-06-03
    • 1970-01-01
    • 1970-01-01
    • 2019-07-17
    相关资源
    最近更新 更多