【问题标题】:How to convert string to number based on units如何根据单位将字符串转换为数字
【发布时间】:2016-07-30 08:18:54
【问题描述】:

我试图通过识别单位(百万或十亿)然后相应地相乘,将以下字符串更改为它们各自的数值。我相信我对变量类型有疑问,但似乎找不到解决方案。有什么建议吗?

1.44B1,440,000,000

1.564M1,564,000

UPDATE [_ParsedXML_Key_Stats]  
SET     [Value] =  CASE

WHEN right(rtrim([_ParsedXML_Key_Stats].[Value]),1) = 'B' And [_ParsedXML_Key_Stats].[NodeName] = 'EBITDA'
THEN substring(rtrim([_ParsedXML_Key_Stats].[Value]),1,len([_ParsedXML_Key_Stats].[Value])-1) * 1000000000
        
WHEN right(rtrim([_ParsedXML_Key_Stats].[Value]),1) = 'M' And [_ParsedXML_Key_Stats].[NodeName] = 'EBITDA'
THEN substring(rtrim([_ParsedXML_Key_Stats].[Value]),1,len([_ParsedXML_Key_Stats].[Value])-1) * 1000000                        
ELSE 0
END

【问题讨论】:

  • 你用的是什么数据库?
  • 对不起,这是 SQL Server 2012
  • 抛出更多细节...您有错误,或者只是您的查询没有执行或不符合您的预期?
  • 我真的希望您使用 FROM,这样您就可以为该表名设置别名。

标签: sql sql-server substring case


【解决方案1】:

对于您的原始查询,我遇到了转换错误,因为乘法将十进制值视为 int,我猜您可能遇到了同样的问题。

解决此问题的一种方法是通过添加.0 将因子转换为小数。

如果你想得到用逗号格式化的数字,你可以使用如下格式函数:FORMAT(CAST(value AS DECIMAL), 'N0')(一定要为十进制类型指定适当的长度和精度)。

下面的 SQL Fiddle 示例测试数据和输出:

SQL Fiddle

MS SQL Server 2014 架构设置

CREATE TABLE [_ParsedXML_Key_Stats] (value VARCHAR(50), NodeName VARCHAR(50));
INSERT [_ParsedXML_Key_Stats] VALUES 
('111', 'SOMETHING ELSE'),
('999', 'EBITDA'),
('47.13B', 'EBITDA'),
('1.44B', 'EBITDA'),
('1.564M', 'EBITDA');

WITH cte AS 
(
    SELECT 
       Value, 
       CAST(LEFT([Value],LEN([Value])-1) AS DECIMAL(28,6)) AS newValue,
       RIGHT(RTRIM([Value]),1) AS c 
    FROM [_ParsedXML_Key_Stats] 
    WHERE [NodeName] = 'EBITDA'
    AND RIGHT(RTRIM([Value]),1) IN ('B','M')
) 

UPDATE cte
SET [Value] = 
CASE
  WHEN c = 'B' THEN newValue * 1000000000.0
  WHEN c = 'M' THEN newValue * 1000000.0
END;

查询 1

SELECT *, FORMAT(CAST(Value AS DECIMAL(18,0)),'N0') AS formattedValue
FROM _ParsedXML_Key_Stats

Results

|              value |       NodeName | formattedValue |
|--------------------|----------------|----------------|
|                111 | SOMETHING ELSE |            111 |
|                999 |         EBITDA |            999 |
| 47130000000.000000 |         EBITDA | 47,130,000,000 |
|  1440000000.000000 |         EBITDA |  1,440,000,000 |
|     1564000.000000 |         EBITDA |      1,564,000 |

【讨论】:

  • @Treyvon - 这是您的解决方案。添加 .0 或转换结果是 jpw 的一个很好的调用。我喜欢他们使用 LEFT 而不是 SUBSTRING 的事实。
  • 谢谢,太好了。如果您不介意,请向您提出 2 个问题:我如何修改以使“47.13B”显示为 47,130,000,000?目前我正在失去“3”。
  • 另外,我怎样才能让 ELSE 语句基本上什么都不做,而不是把那里的东西归零?当我尝试更改它时,我得到“将数据类型 nvarchar 转换为数字时出错。”谢谢!
  • @Treyvon 我已经更新了查询,以便它只更改正确的行。 47,13B 中的 3 被隐式转换为小数(18,0)而被截断,(这就是为什么应该始终指定精度 - 我的错)。查询现在应该可以正常工作了。
  • @Treyvon 如果我的回答为您的问题提供了解决方案,请考虑将其标记为已接受。 :)
猜你喜欢
  • 2018-09-28
  • 1970-01-01
  • 1970-01-01
  • 2013-05-11
  • 2017-12-06
  • 2012-11-24
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
相关资源
最近更新 更多