sqlserver与减号相加

时间:2015-10-27 12:51:25

标签: sql sql-server-2012

我使用的是sqlserver 2012。 我有这样的查询

SELECT SUM(TH.CLEAVE_EARN_DAY), SUM(TH.CLEAVE_DAY), 
       SUM(TH.CLEAVE_EARN_DAY) - SUM(TH.CLEAVE_DAY) 
FROM TH_LEAVE_CARD TH 

结果是0,14.5,-15 所以-15错了。必须是-14.5

任何建议?

4 个答案:

答案 0 :(得分:3)

这是你可以尝试的

SELECT SUM(TH.CLEAVE_EARN_DAY), SUM(TH.CLEAVE_DAY), 
   SUM(TH.CLEAVE_EARN_DAY)*1.0 - SUM(TH.CLEAVE_DAY) 
FROM TH_LEAVE_CARD TH 

乘以1.0只会给你后面的小数值,带走会给你你所要求的

答案 1 :(得分:0)

尝试将所有参数转换为相同的数据类型,然后进行计算:

SELECT
  SUM(CAST(TH.CLEAVE_EARN_DAY AS DECIMAL(18,2))),
  SUM(CAST(TH.CLEAVE_DAY AS DECIMAL(18,2))), 
  SUM(CAST(TH.CLEAVE_EARN_DAY AS DECIMAL(18,2)) 
    - CAST(TH.CLEAVE_DAY AS DECIMAL(18,2))) AS substraction 
FROM TH_LEAVE_CARD TH 

你也可以结合使用:

SUM(TH.CLEAVE_EARN_DAY) - SUM(TH.CLEAVE_DAY) 

to(如果两列都是NOT NULL):

SUM(TH.CLEAVE_EARN_DAY - TH.CLEAVE_DAY)

或(感谢Arvo指出这一点):

SUM(ISNULL(TH.CLEAVE_EARN_DAY,0) - ISNULL(TH.CLEAVE_DAY,0))

答案 2 :(得分:0)

对列执行数学运算:

  1. 使用的列应转换为相同的数字/小数数据类型。

  2. 要处理空值,您可以使用ISNULL函数。 例如:

    SELECT SUM(TH.CLEAVE_EARN_DAY), SUM(TH.CLEAVE_DAY), 
       SUM(cast  (TH.CLEAVE_EARN_DAY) as decimal(5,1)) - SUM(cast ( (TH.CLEAVE_DAY) as decimal(5,1))
    FROM TH_LEAVE_CARD 
    

答案 3 :(得分:0)

几乎没有理由可以使结果不符合您的期望。在Sql Server中,任何包含null的数学运算都将导致null。例如sum(1,2,3,null,4)等于null。 1 + null也等于null。

因此,如果值为null,使用nonull函数分配默认值会更安全。

用于数学运算。 sql server将根据指定的数据类型进行计算。例如int / int = int。因此结果将被遗漏。因为大多数时候int / int = float。

最好在执行任何算术运算之前将值更改为double。

下面是包含了isull函数以及强制转换为float的示例。

<!DOCTYPE html>
<html>

<head>
    <title>JS Bin</title>
</head>

<body>
    <video id="player" class="video-js" controls preload="auto" width="640" height="264" poster="https://vjs.zencdn.net/v/oceans.png" data-setup="{}">
        <source src="https://vjs.zencdn.net/v/oceans.mp4" type='video/mp4'>
    </video>
    <link href="https://cdnjs.cloudflare.com/ajax/libs/video.js/7.1.0/video-js.css" rel="stylesheet">
    <script src="https://cdnjs.cloudflare.com/ajax/libs/video.js/7.1.0/video.js"></script>


    <script>
        videojs('player').ready(function() {
            var player = this;
            player.controlBar.progressControl.seekBar.on('mouseup', function(event) {
                var seekBarEl = this.el();
                var seekBarRect = videojs.dom.getBoundingClientRect(seekBarEl);
                var seekBarPoint = videojs.dom.getPointerPosition(seekBarEl, event).x;
                var duration = player.duration();
                var seekBarClickedTime = videojs.formatTime(seekBarPoint * duration, duration);
                console.log('Seekbar clicked time: ', seekBarClickedTime);
               player.pause();
              console.log(player.pause());
            });
        });
    </script>

</body>

</html>