【问题标题】:ORDER BY - Sorting the column consisting money with unitsORDER BY - 用单位对包含货币的列进行排序
【发布时间】:2020-12-02 19:36:46
【问题描述】:

我在 SQL 中有一个包含各种列的股票相关表,其中一个是“市值”。此列是“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

谁能建议一个查询来解决这个问题?

提前谢谢你。

【问题讨论】:

  • 重新设计架构并在写入该表时输入规范化值。在这种情况下,数字实际上数字,因此将其存储为文本不是一个好主意。
  • 为什么这个问题被标记为 MySQL?它不支持 T-SQL。

标签: sql-server sorting tsql sql-order-by sql-server-2019


【解决方案1】:

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

退货

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

【讨论】:

  • @SaiKushalG 总是乐于提供帮助
猜你喜欢
  • 2022-07-12
  • 1970-01-01
  • 2013-09-06
  • 2021-10-07
  • 2020-10-20
  • 1970-01-01
  • 2016-01-07
  • 1970-01-01
  • 2019-07-06
相关资源
最近更新 更多