让我说我有一个包含一些通用数据持有者列的表(所以看起来原始代码的开发者选择使用字符串类型)。这些列可以容纳所有数字,字母数字或它们的混合。
让我说我有一个共同相关的子查询,如;
SOME_CORELATED_QUERY=(SOME SELECT SQL)
让我们说我有一个order by子句;
order by ID,SOME_CORELATED_QUERY
现在因为这些字段都是基于varchar的,所以默认情况下我无法对它们进行数字排序。
我可以为我的共同相关子查询尝试这个;
SOME_CORELATED_QUERY=cast((SOME SELECT SQL) as int)
但上面的问题是,并非我的所有数据都是数字,我会收到错误;
Conversion failed when converting the varchar value '304L' to data type int.
所以我找到了一个解决方案here,它基本上使用了对我的问题可行的空格,但问题是我无法将它应用于共同相关的子查询。
如果我尝试将它应用于我的表列ID,则一切正常;
order by space(50-len(ID))+ID, SOME_CORELATED_QUERY
但这不能作为解决方案,因为我需要对我的SOME_CORELATED_QUERY进行数字排序。我试着这样做;
order by space(50-len(SOME_CORELATED_QUERY))+SOME_CORELATED_QUERY
但是我得到一条错误消息,因为有些我的共同相关的子查询无法被空间,强制转换,转换等SQL函数识别:
Msg 207, Level 16, State 1, Line 48
Invalid column name 'SOME_CORELATED_QUERY'.
Msg 207, Level 16, State 1, Line 48
Invalid column name 'SOME_CORELATED_QUERY'.
所以基本上我需要在排序时使用SQL函数空间,强制转换,转换我的共同相关子查询。
注意:更改数据库布局时,字段类型是不可能的,因为布局在我使用的程序上是硬编码的,我只是为用户创建基于SQL的报告。
更新:感谢Brad,我更新了问题文本以使用“共同相关的子查询”,因为它比虚拟列更好的描述。
Update2:这是要求的全sql;
select ID, S.STOCK_ID ,S.STOCK_CODE,S.STOK_SHORT_NAME,S.UNIT1_NAME UNIT_NAME,
PROPERTY_VALUE_NAME1=(Select PROPERTY_VALUE from STOCK_PROPERTY_VALUES where PROPERTY_VALUE_ID=a.PROPERTY_VALUE_ID_1),
PROPERTY_NAME1=(Select PROPERTY_NAME from STOCK_PROPERTY_DEFINITIONS SOT, STOCK_PROPERTY_TEMPLATES SOS where SOS.PROPERTY1_ID=SOT.PROPERTY_ID and SOS.ID=a.ID),
PROPERTY_VALUE_NAME2=(Select PROPERTY_VALUE from STOCK_PROPERTY_VALUES where PROPERTY_VALUE_ID=a.PROPERTY_VALUE_ID_2),
PROPERTY_NAME2=(Select PROPERTY_NAME from STOCK_PROPERTY_DEFINITIONS SOT,STOCK_PROPERTY_TEMPLATES SOS where SOS.PROPERTY2_ID=SOT.PROPERTY_ID and SOS.ID=a.ID),
PROPERTY_VALUE_NAME3=(Select PROPERTY_VALUE from STOCK_PROPERTY_VALUES where PROPERTY_VALUE_ID=a.PROPERTY_VALUE_ID_3),
PROPERTY_NAME3=(Select PROPERTY_NAME from STOCK_PROPERTY_DEFINITIONS SOT,STOCK_PROPERTY_TEMPLATES SOS where SOS.PROPERTY3_ID=SOT.PROPERTY_ID and SOS.ID=a.ID),
PROPERTY_VALUE_NAME4=(Select PROPERTY_VALUE from STOCK_PROPERTY_VALUES where PROPERTY_VALUE_ID=a.PROPERTY_VALUE_ID_4),
PROPERTY_NAME4=(Select PROPERTY_NAME from STOCK_PROPERTY_DEFINITIONS SOT,STOCK_PROPERTY_TEMPLATES SOS where SOS.PROPERTY4_ID=SOT.PROPERTY_ID and SOS.ID=a.ID),
PROPERTY_VALUE_NAME5=(Select PROPERTY_VALUE from STOCK_PROPERTY_VALUES where PROPERTY_VALUE_ID=a.PROPERTY_VALUE_ID_5),
PROPERTY_NAME5=(Select PROPERTY_NAME from STOCK_PROPERTY_DEFINITIONS SOT,STOCK_PROPERTY_TEMPLATES SOS where SOS.PROPERTY5_ID=SOT.PROPERTY_ID and SOS.ID=a.ID),
PROPERTY_VALUE_NAME6=(Select PROPERTY_VALUE from STOCK_PROPERTY_VALUES where PROPERTY_VALUE_ID=a.PROPERTY_VALUE_ID_6),
PROPERTY_NAME6=(Select PROPERTY_NAME from STOCK_PROPERTY_DEFINITIONS SOT,STOCK_PROPERTY_TEMPLATES SOS where SOS.PROPERTY6_ID=SOT.PROPERTY_ID and SOS.ID=a.ID),
PROPERTY_VALUE_NAME7=(Select PROPERTY_VALUE from STOCK_PROPERTY_VALUES where PROPERTY_VALUE_ID=a.PROPERTY_VALUE_ID_7),
PROPERTY_NAME7=(Select PROPERTY_NAME from STOCK_PROPERTY_DEFINITIONS SOT,STOCK_PROPERTY_TEMPLATES SOS where SOS.PROPERTY7_ID=SOT.PROPERTY_ID and SOS.ID=a.ID),
isnull(SUM(case IN_OUT when 1 then UNIT1_VALUE else 0 end),0) IN_VALUE,
isnull(SUM(case IN_OUT when 2 then UNIT1_VALUE else 0 end),0) OUT_VALUE
from STOCK_PROPERTY_DETAILS a, STOCK b, STOCK_TRANSACTION_ROWS DHS, STOCK S, WAREHOUSE D
where a.STOCK_ID=b.STOCK_ID and b.STOCK_ID *= DHS.SHD_ID and DHS.SHD = 1 and ID>0 and B.UPPER_STOCK_ID=S.STOCK_ID and D.WAREHOUSE_ID*=DHS.WAREHOUSE_ID
group by S.STOCK_ID ,S.STOCK_CODE,S.STOK_SHORT_NAME,S.UNIT1_NAME, PROPERTY_VALUE_ID_1,PROPERTY_VALUE_ID_2,PROPERTY_VALUE_ID_3,PROPERTY_VALUE_ID_4,PROPERTY_VALUE_ID_5,PROPERTY_VALUE_ID_6,PROPERTY_VALUE_ID_7,ID
having 1=1 and ((isnull(SUM(case IN_OUT when 1 then UNIT1_VALUE else 0 end),0)-isnull(SUM(case IN_OUT when 2 then UNIT1_VALUE else 0 end),0)<>0 /*##ZERO#*/) or (not(1=1 /*##ZERO#*/)))
order by ID,PROPERTY_VALUE_NAME1,PROPERTY_VALUE_NAME2,PROPERTY_VALUE_NAME3,PROPERTY_VALUE_NAME4,PROPERTY_VALUE_NAME5,PROPERTY_VALUE_NAME6,PROPERTY_VALUE_NAME7
我想对PROPERTY_VALUE_NAME1,PROPERTY_VALUE_NAME2进行排序等等。
答案 0 :(得分:0)
对于字符数据的数字排序,请使用ORDER BY LEN(columnName), columnName
。
答案 1 :(得分:0)
我无法测试它,因为我没有实例,但如果它允许你在它上面使用case语句,那么这样的事情可能会起作用
order by
case
when isnumeric(columnname) then cast(columnname as int)
else -1
end,
columnname
希望这可以分两种方式进行,第一种按数字顺序排序数值,并将组中的alpha内容归为-1,然后由第二部分按alpha排序