选择十进制值时,格式不正确

时间:2018-08-20 17:51:31

标签: sql sql-server tsql

我有下表,当我选择要对“时间和事件”进行总计的位置时,即使将临时表定义为小数(9,1),其中之一也无法正确格式化。

DECLARE @mediaTable TABLE
(
    MediaCode varchar(1),
    NumEvents tinyint,
    TotalTime decimal (9, 1),
    AverageTime decimal (9, 1)
) 

表格数据:

MediaCode    NumEvents    TotalTime    AverageTime
A            2            8.0          4.0
B            42           104.0        2.5
C            26           26.2         1.0
D            0            0.0          0.0
E            4            14.0         3.5
F            0            0.0          0.0
G            2            2.5          1.3
H            0            0.0          0.0
I            4            9.0          2.3
J            1            2.0          2.0
L            6            57.5         9.6
M            8            12.0         1.5
N            0            0.0          0.0
P            0            0.0          0.0
S            4            20.0         5.0
T            4            10.0         2.5
V            2            1.5          0.8
W            8            29.0         3.6
X            0            0.0          0.0

我正在运行的查询是:

SELECT      SUM(NumEvents) AS [sum],
            SUM(TotalTime) AS [sum],
            SUM(CASE WHEN MediaCode IN ('A','B','D','E','F','G','I','J','L','M','P','S','T') THEN NumEvents END) AS [sum], 
            SUM(CASE WHEN MediaCode IN ('A','B','D','E','F','G','I','J','L','M','P','S','T') THEN TotalTime END) AS [sum], 
            SUM(CASE WHEN MediaCode IN ('B', 'T') THEN NumEvents / 2 ELSE NumEvents END) AS [sum],
            SUM(CASE WHEN MediaCode IN ('B', 'T') THEN TotalTime / 2 ELSE TotalTime END) AS [sum] 
    FROM    @mediaTable

查询结果为:

sum    sum    sum    sum    sum    sum
113    295.7  77     239.0  90     238.700000

我无法正确格式化/显示的是238.700000。

给我合适的线是

SUM(CASE WHEN MediaCode IN ('B', 'T') THEN TotalTime / 2 ELSE TotalTime END) AS [sum]

我已经尝试过格式化,转换和转换,但是它不想合作。我知道它可能是/ 2,但我不知道该如何解决。有任何想法吗?感谢您的协助。

2 个答案:

答案 0 :(得分:2)

CAST()功能将对您已经发表评论的功能起作用

select CAST(238.700000 AS DECIMAL(9,1)) ---it returns 238.7

所以您的情况应该是

  CAST(SUM(CASE
    WHEN MediaCode IN ('B', 'T') THEN TotalTime / 2
    ELSE TotalTime
  END) AS decimal(9, 1))

答案 1 :(得分:1)

如果要获取修复程序scale,则需要执行cast()precision来定义scaledecimal()

SELECT . . .,
      CAST(SUM(CASE WHEN MediaCode IN ('B', 'T') 
                    THEN TotalTime / 2 ELSE TotalTime 
               END) AS DECIMAL(9, 1) --- will return 238.7
          ) AS [sum]
FROM @mediaTable mt;