ORDER BY - 对包含货币和单位的列进行排序
ORDER BY - Sorting the column consisting money with units
我在 SQL 中有一只与 table 相关的股票,其中有多个列,其中一个是“市值”。此列为“nvarchar”数据类型,具有 1.16T、1.2B、70.324 M、8B 等值
其中 T= 万亿 > B= 十亿 > M = 百万
我需要按降序对这些值进行排序。
我试过这个查询:
select MarketCap from StockSummary
ORDER BY
CASE WHEN ISNUMERIC(MarketCap) = 1 THEN 0 ELSE 1 END,
CASE WHEN ISNUMERIC(MarketCap) = 1 THEN CAST(MarketCap AS float) ELSE 0 END,
MarketCap DESC
输出:
Market Cap
700.394M
61.816B
6.983B
39.511B
28.996B
231.31M
2.112B
1.23T
数字按降序排列,但不考虑单位(T=万亿 > B= 十亿 > M = 百万)。因此不满足我的要求。
要求输出:
Market Cap
1.23T
61.816B
39.511B
28.996B
6.983B
2.112B
700.394M
231.31M
任何人都可以提出解决此问题的查询吗?
提前致谢。
将 patindex()
与 try_convert()
结合使用,我们可以获得值,然后使用简单的 CASE
来解析比例。
例子
Declare @YourTable Table ([Market Cap] varchar(50)) Insert Into @YourTable Values
('700.394M')
,('61.816B')
,('6.983B')
,('39.511B')
,('28.996B')
,('231.31M')
,('2.112B')
,('1.23T')
Select *
From @YourTable
Order By try_convert(money,left([Market Cap],patindex('%[a-z]%',[Market Cap]+'a')-1))
* case when [Market Cap] like '%M%' then 1000000
when [Market Cap] like '%B%' then 1000000000
when [Market Cap] like '%T%' then 1000000000000
else 1 end Desc
Returns
Market Cap
1.23T
61.816B
39.511B
28.996B
6.983B
2.112B
700.394M
231.31M
编辑
只是另一个选择
...
Order By try_convert(float,replace(replace(replace([Market Cap],'M','E6'),'B','E9'),'T','E12')) Desc
我在 SQL 中有一只与 table 相关的股票,其中有多个列,其中一个是“市值”。此列为“nvarchar”数据类型,具有 1.16T、1.2B、70.324 M、8B 等值
其中 T= 万亿 > B= 十亿 > M = 百万
我需要按降序对这些值进行排序。
我试过这个查询:
select MarketCap from StockSummary
ORDER BY
CASE WHEN ISNUMERIC(MarketCap) = 1 THEN 0 ELSE 1 END,
CASE WHEN ISNUMERIC(MarketCap) = 1 THEN CAST(MarketCap AS float) ELSE 0 END,
MarketCap DESC
输出:
Market Cap
700.394M
61.816B
6.983B
39.511B
28.996B
231.31M
2.112B
1.23T
数字按降序排列,但不考虑单位(T=万亿 > B= 十亿 > M = 百万)。因此不满足我的要求。
要求输出:
Market Cap
1.23T
61.816B
39.511B
28.996B
6.983B
2.112B
700.394M
231.31M
任何人都可以提出解决此问题的查询吗?
提前致谢。
将 patindex()
与 try_convert()
结合使用,我们可以获得值,然后使用简单的 CASE
来解析比例。
例子
Declare @YourTable Table ([Market Cap] varchar(50)) Insert Into @YourTable Values
('700.394M')
,('61.816B')
,('6.983B')
,('39.511B')
,('28.996B')
,('231.31M')
,('2.112B')
,('1.23T')
Select *
From @YourTable
Order By try_convert(money,left([Market Cap],patindex('%[a-z]%',[Market Cap]+'a')-1))
* case when [Market Cap] like '%M%' then 1000000
when [Market Cap] like '%B%' then 1000000000
when [Market Cap] like '%T%' then 1000000000000
else 1 end Desc
Returns
Market Cap
1.23T
61.816B
39.511B
28.996B
6.983B
2.112B
700.394M
231.31M
编辑
只是另一个选择
...
Order By try_convert(float,replace(replace(replace([Market Cap],'M','E6'),'B','E9'),'T','E12')) Desc