有两个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的时候不够减,会发生什么情况? 请详细解答
多谢各位 感激不尽!

解决方案 »

  1.   

    ----------------------------------------------------------------
    -- 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
    */
      

  2.   

    ----------------------------------------------------------------
    -- 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
    */
      

  3.   

    因为 任何值加NULL 结果为 NULL
      

  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 行受影响)
    */
      

  5.   


    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
      

  6.   

    sum(a+b)和sum(a)+sum(b)不一样
    sum(a+b)是先执行a+b 再求总和
    而当A=3的时候 加的是一个空值 用逻辑表达式判断的话仍然为空 值为0 所以sum(a+b)=24
    sum(a)+sum(b)就不一样了 
    这个是先求a 的总和  再求b的总和  然后2者相加 所以是27
    减法同理
      

  7.   

    --一句话
    --对于同一列的值 即使有NULL值 也会忽略,直接相加就好  比如上面的sum(a)
    --对于两列值相加 当其中一列出现NULL时候 NULL不会被忽略,与他对应的列相加后的和就为0 注意 只是一行而已 如果2列对应没有出现NULL 还是一样相加 最后汇总相加 
      

  8.   

    空值表示值未知。空值不同于空白或零值。没有两个相等的空值。比较两个空值或将空值与任何其他值相比均返回未知,这是因为每个空值均为未知。空值一般表示数据未知、不适用或将在以后添加数据。例如,客户的中间名首字母在客户下定单时可能不知道。下列是有关空值的信息: 若要在查询中测试空值,请在 WHERE 子句中使用 IS NULL 或 IS NOT 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。
      

  9.   

    主要是null的问题
    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处理了。
      

  10.   

    空值NULL在任何聚集操作中都被忽略。它对求和、取平均和计数都没有影响
      

  11.   


    http://www.dna23.net 江苏苏博生物医学科技有限公司 【亲子鉴定】
      

  12.   


    http://www.dna23.net 江苏苏博生物医学科技有限公司 【亲子鉴定】