SUM(var1 + var2)返回什么?

时间:2016-10-13 16:06:40

标签: sql-server tsql

我正在进行一些分组并尝试以下方法:

declare @toErase table
(
    Group1 int,
    Num int,
    Denom int
)
insert into @toErase select 1, 1, 5
insert into @toErase select 1, 3, 36
insert into @toErase select 1, 4, null
insert into @toErase select 1, null, 15

select sum(num + denom) from @toErase group by group1

-- Returns 45

这将返回45. 45来自哪里?

另一方面,select sum(num) + sum(denom) from @toErase group by group1返回正确的值。

感谢。

7 个答案:

答案 0 :(得分:5)

它来自:

row1: 1+5 = 6
row2: 3+36 = 39
row3: 4+null = null
row4: null+15 = null

SUM忽略空值,因此结果为6 + 39 = 45。

使用ISNULLCOALESCE将空值替换为默认值(可能为0),从而在+操作中有效地忽略它们。

答案 1 :(得分:0)

非null值与null值的总和为空。

因此,4 + null和null + 15都会导致null,SUM会忽略它们。

答案 2 :(得分:0)

您在输出中得到45,因为如果您使用NULL执行添加,结果将为NULL,因此在第三和第四上执行操作的结果行为NULL,已排除在sum()之外。

如果您希望包含此类案例,请在两列上添加COALESCE()以返回0而不是NULL作为添加操作的参数:

select sum(coalesce(num,0) + coalesce(denom,0)) from @toErase group by group1

这可能会给你预期64

答案 3 :(得分:0)

(1 + 5)=> 6

(3 + 36)=> 39

4 + null =>空
注意:NULL会将add添加为null

null + 15 =>空值 注意:NULL会将add添加为null

所以6 + 39 => 45个
注意:sum()忽略null

答案 4 :(得分:0)

如果对null和整数执行SUM,则结果为null。

如果要将null视为0,则可以始终使用ISNULL命令将空整数默认为其他内容(我的示例将null替换为0):

declare @toErase table
(
    Group1 int,
    Num int,
    Denom int
)
insert into @toErase select 1, 1, 5
insert into @toErase select 1, 3, 36
insert into @toErase select 1, 4, null
insert into @toErase select 1, null, 15

select sum(ISNULL(num,0) + ISNULL(denom,0)) from @toErase group by group1

这将返回64。

答案 5 :(得分:0)

由于您希望使用SUM的其他行列中的NULL,您的SUM仅保留这两行:

SELECT pr.province_name,
       co.country_name
FROM   province pr
       INNER JOIN (SELECT *
                   FROM   (SELECT co.*,
                                  ROW_NUMBER () OVER (PARTITION BY co.country_id ORDER BY co.country_name) rn
                           FROM   country co)
                   WHERE  rn = 1) co
         ON co.country_id = pr.country_id
WHERE  pr.province_id IN (1, 2)

所以你得到:1 + 5 + 36 + 3 = 45

答案 6 :(得分:0)

结果是因为SUM忽略空值,例如4 + null = null,因此不考虑最终总和。

1+5 = 6
3+36 = 39
4+null = null
null+15 = null

所以,6 + 39 = 45。也许COALESCE()可以帮助你

你可以试试这个:

来自@toErase GROUP BY group1的SELECT SUM(COALESCE(num,0)+ COALESCE(denom,0))