有两个column,分别为a,ba: 1,2,3,4,5
b: 1,2,NULL,4,5为什么sum(a+b)与sum(a)+sum(b)结果不一样? 请详细解答a: 1,2,3,4,10
b: Null,1,4,5,6sum(a-b)与sum(a)-sum(b)值不一样,当3-4的时候不够减,会发生什么情况? 请详细解答
多谢各位 感激不尽!
b: 1,2,NULL,4,5为什么sum(a+b)与sum(a)+sum(b)结果不一样? 请详细解答a: 1,2,3,4,10
b: Null,1,4,5,6sum(a-b)与sum(a)-sum(b)值不一样,当3-4的时候不够减,会发生什么情况? 请详细解答
多谢各位 感激不尽!
-- Author :fredrickhu(小F 向高手学习)
-- Date :2009-06-19 20:57:12
----------------------------------------------------------------
--> 测试数据:[ta]
if object_id('[ta]') is not null drop table [ta]
create table [ta]([a] int,[b] int)
insert [ta]
select 1,1 union all
select 2,2 union all
select 3,null union all
select 4,4 union all
select 5,5
--------------开始查询--------------------------select sum(a+b) from [ta]
select sum(a)+sum(b) from [ta]
----------------结果----------------------------
/*--
sum(a+b)=24
sum(a)+sum(b)=27
*/
-- Author :fredrickhu(小F 向高手学习)
-- Date :2009-06-19 21:02:48
----------------------------------------------------------------
--> 测试数据:[tb]
if object_id('[tb]') is not null drop table [tb]
create table [tb]([a] int,[b] int)
insert [tb]
select 1,null union all
select 2,1 union all
select 3,4 union all
select 4,5 union all
select 10,6
--------------开始查询--------------------------select sum(a-b) from [tb]
select sum(a)-sum(b) from [tb]
----------------结果----------------------------
/*
sum(a-b)=3
sum(a)-sum(b)=4
*/
楼主注意这个NULL
你说SUM(a+b) 与SUM(A) + SUM(B)的结果不一样。
原因就在于 3+ null 结果是NULL ,所以导致SUM(A) + SUM(B) 的值比SUM(A + B)的值大。楼主可以修改下就一致了。借用下小F的数据
if object_id('[ta]') is not null drop table [ta]
create table [ta]([a] int,[b] int)
insert [ta]
select 1,1 union all
select 2,2 union all
select 3,null union all
select 4,4 union all
select 5,5
--------------开始查询--------------------------select sum(a+isnull(b,0)) from [ta]
select sum(a)+sum(b) from [ta]
----------------结果----------------------------/*-----------
27
(1 行受影响)-----------
27
(1 行受影响)
*/
select sum(a+b) from [tb] --先计算a列加b列,得到的结果为2,4,null,8,10,再把这些值求和,系统消除NULL值,结果为24
select sum(a)+sum(b) from [tb] --分别对a列和b列进行求和再相加,a列结果为15,b列系统消除NULL值后结果为12,最终结果为:15+12=27
sum(a+b)是先执行a+b 再求总和
而当A=3的时候 加的是一个空值 用逻辑表达式判断的话仍然为空 值为0 所以sum(a+b)=24
sum(a)+sum(b)就不一样了
这个是先求a 的总和 再求b的总和 然后2者相加 所以是27
减法同理
--对于同一列的值 即使有NULL值 也会忽略,直接相加就好 比如上面的sum(a)
--对于两列值相加 当其中一列出现NULL时候 NULL不会被忽略,与他对应的列相加后的和就为0 注意 只是一行而已 如果2列对应没有出现NULL 还是一样相加 最后汇总相加
在 SQL Server Management Studio 代码编辑器中查看查询结果时,空值在结果集中显示为 (null)。
可通过下列方法在列中插入空值:在 INSERT 或 UPDATE 语句中显式声明 NULL,或不让列出现在 INSERT 语句中,或使用 ALTER TABLE 语句在现有表中新添一列。
不能将空值用于区分表中两行所需的信息(例如,外键或主键)。
在程序代码中,可以检查空值以便只对具有有效(或非空)数据的行执行某些计算。例如,报表可以只打印列中数据不为空的社会安全列。执行计算时删除空值很重要,因为如果包含空值列,某些计算(如平均值)会不准确。如果数据中可能存储有空值而您又不希望数据中出现空值,就应该创建查询和数据修改语句,删除空值或将它们转换为其他值。重要事项:
为了尽量减少对现有查询或报告的维护和可能的影响,应尽量少用空值。对查询和数据修改语句进行计划,使空值的影响降到最小。
如果数据中出现空值,则逻辑运算符和比较运算符有可能返回 TRUE 或 FALSE 以外的第三种结果 UNKNOWN。需要三值逻辑是导致出现许多应用程序错误的根源。下面这些表概括了引入空值比较的效果。下表显示了将 AND 运算符应用到两个布尔操作数的结果。AND TRUE UNKNOWN FLASE
TRUE
TRUE
UNKNOWN
FLASE
UNKNOWN
UNKNOWN
UNKNOWN
FLASE
FLASE
FLASE
FLASE
FLASE
下表显示了将 OR 运算符应用到两个布尔操作数的结果。OR TRUE UNKNOWN FLASE
TRUE
TRUE
TRUE
TRUE
UNKNOWN
TRUE
UNKNOWN
UNKNOWN
FLASE
TRUE
UNKNOWN
FLASE
下表显示了 NOT 运算符如何对布尔运算符的结果执行求反(或反向)操作。应用 NOT 运算符的布尔表达式 求出的值为
TRUE
FLASE
UNKNOWN
UNKNOWN
FLASE
TRUE
SQL-92 标准引入了关键字 IS NULL 和 IS NOT NULL 来测试是否存在空值。应用 IS NULL 运算符的布尔表达式 求出的值为 应用 IS NOT NULL 运算符的布尔表达式 求出的值为
TRUE
FLASE
TRUE
TRUE
空
TRUE
空
FLASE
FLASE
FLASE
FLASE
TRUE
Transact-SQL 还提供空值处理的扩展功能。如果 ANSI_NULLS 选项设置为 OFF,则空值之间的比较(如 NULL = NULL)等于 TRUE。空值与任何其他数据值之间的比较都等于 FALSE。
sum(a+b),如果b是null,则结果是 nullcreate table tb2 (f1 int,f2 int)insert into tb2
select 1,null union all
select null,3 union all
select 2 ,6 union all
select 5,5select *
from tb2select sum(f1+f2) from tb2
结果:18,因为1+null为nullselect sum(f1)+sum(f2) from tb2
结果:22,因为此时将 null 按照0处理了。
http://www.dna23.net 江苏苏博生物医学科技有限公司 【亲子鉴定】
http://www.dna23.net 江苏苏博生物医学科技有限公司 【亲子鉴定】