我使用的是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
任何建议?
答案 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)
对列执行数学运算:
使用的列应转换为相同的数字/小数数据类型。
要处理空值,您可以使用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>