2016-11-08 16 views
0

我有一种情况,我从其他公司获取行程数据。另一家公司以⅛加仑的精度测量燃油。SQL Server:如何将小数映射到校正值

我从另一家公司获得数据并将其存储在我的SQL Server表中。燃料总量是不正确的。我发现,当另一家公司以1/8加仑的燃料储存时,它只给我一个小数位。

此外,由于这个post,我已经确定,该公司不四舍五入值最近的十分之一,但不是截断他们。

查询:

/** Fuel Fractions **/ 
SELECT DISTINCT ([TotalFuelUsed] % 1) AS [TotalFuelUsedDecimals] 
FROM [Raw] 
ORDER BY [TotalFuelUsedDecimals] 

结果:

TotalFuelUsedDecimals 
0.00 
0.10 
0.20 
0.30 
0.50 
0.60 
0.70 
0.80 

我想是一个修正的燃料列添加到我的看法这将映射为一个有效的方法如下:

  • 0.00→0.000
  • 0.10→0.125
  • 0.20→0.250
  • 0.30→0.375
  • 0.50→0.500
  • 0.60→0.625
  • 0.70→0.750
  • 0.80→0.875
  • 1.80→1.875

我是新来的SQL,所以请善待。

服务器正在运行Microsoft SQL Server 2008。但是,如果你知道一种更好的功能,只能通过新的SQL Server支持,请张贴过,因为我们可能在不久的将来升级,它可以帮助别人。

而且,如果这有什么差别,也有,我会修正表几种不同的燃料列。

回答

0

在写了这个问题,我尝试使用临时表下面的方法和多加入这似乎工作。我希望有更好的解决方案。

CREATE TABLE #TempMap 
    ([from] decimal(18,2), [to] decimal(18,3)) 
; 

INSERT INTO #TempMap 
    ([from], [to]) 
VALUES 
    (0.0, 0.000), 
    (0.1, 0.125), 
    (0.2, 0.250), 
    (0.3, 0.375), 
    (0.5, 0.500), 
    (0.6, 0.625), 
    (0.7, 0.750), 
    (0.8, 0.875) 
; 

SELECT [TotalFuelUsed] 
    ,[TotalFuelCorrect].[to] + ROUND([TotalFuelUsed], 0, 1) AS [TotalFuelUsedCorrected] 
    ,[IdleFuelUsed] 
    ,[IdleFuelCorrect].[to] + ROUND([IdleFuelUsed], 0, 1) AS [IdleFuelUsedCorrected] 
FROM [Raw] 
JOIN [#TempMap] AS [TotalFuelCorrect] ON [TotalFuelUsed] % 1 = [TotalFuelCorrect].[from] 
JOIN [#TempMap] AS [IdleFuelCorrect] ON [IdleFuelUsed] % 1 = [IdleFuelCorrect].[from] 
ORDER BY [TotalFuelUsed] DESC 

DROP TABLE #TempMap; 
0

尝试添加列:

select .... 
, case when right(cast([TotalFuelUsed] as decimal(12,1)), 1) = 1 then [TotalFuelUsed] + 0.025 
      when right(cast([TotalFuelUsed] as decimal(12,1)), 1) = 2 then [TotalFuelUsed] + 0.05 
      when right(cast([TotalFuelUsed] as decimal(12,1)), 1) = 3 then [TotalFuelUsed] + 0.075 
      when right(cast([TotalFuelUsed] as decimal(12,1)), 1) = 6 then [TotalFuelUsed] + 0.025 
      when right(cast([TotalFuelUsed] as decimal(12,1)), 1) = 7 then [TotalFuelUsed] + 0.05 
      when right(cast([TotalFuelUsed] as decimal(12,1)), 1) = 8 then [TotalFuelUsed] + 0.075 
      else [TotalFuelUsed] end as updatedTotalFuelUsed 
相关问题