如何根据单位

时间:2016-04-08 22:23:01

标签: sql sql-server substring case

我试图通过识别单位(数百万或数十亿)然后相应地相乘来将以下字符串更改为各自的数值。我相信我遇到了变量类型的问题,但似乎无法找到解决方案。有什么提示吗?

  

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

1 个答案:

答案 0 :(得分: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 |
相关问题