在此查询中,我试图选择所有不同的(字母数字)计算机名称并正确地对其进行排序(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!
答案 0 :(得分:0)
您可以使用子查询将两个部分分开:
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