我正在进行一些分组并尝试以下方法:
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
返回正确的值。
感谢。
答案 0 :(得分:5)
它来自:
row1: 1+5 = 6
row2: 3+36 = 39
row3: 4+null = null
row4: null+15 = null
SUM
忽略空值,因此结果为6 + 39 = 45。
使用ISNULL
或COALESCE
将空值替换为默认值(可能为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))