大家好。
请问一个问题:
如下有三张表,第三张表示根据前两张表求出每个人的收入和余额,现在我的问题是王五因为没有支出,因为在表一相当于是null,
我写SQL的思路是按照姓名将表一减去表二就是余额,但是现在的结果是表三中王五的余额为null,我认为是因为
int 类型减去 null类型后也变成null类型,
请问正确的方式怎样写sql语句。表一:
姓名       支出
李四 -1000
张山 -2000表二:
姓名      收入
张山 5000
李四 1000
王五 1000表三:
姓名    总存款     余额    
张山 5000 3000
李四 1000 0
王五 1000 NULL

解决方案 »

  1.   

    select isnull(收入,0)-isnull(支出,0)
      

  2.   

    要先找出所有的人,再与两个表左连接.
    create table t1(姓名 nvarchar(10),支出 int)
    insert into t1 select '李四',-1000
    insert into t1 select '张山',-2000
    create table t2(姓名 nvarchar(10),收入 int)
    insert into t2 select '张山', 5000
    insert into t2 select '李四', 1000
    insert into t2 select '王五', 1000
    go
    select a.姓名,sum(c.收入) as 总存款,sum(c.收入)+sum(b.支出) as 余额
    from
    (select distinct 姓名 from(
    select 姓名 from t1
    union
    select 姓名 from t2
    )t
    )a left join t1 b on a.姓名=b.姓名 
    left join t2 c on a.姓名=c.姓名
    group by a.姓名
    /*
    姓名         总存款         余额
    ---------- ----------- -----------
    李四         1000        0
    王五         1000        NULL
    张山         5000        3000
    警告: 聚合或其他 SET 操作消除了空值。(3 行受影响)*/
    go
    drop table t1,t2
      

  3.   

    create table t1(姓名 nvarchar(10),支出 int)
    insert into t1 select '李四',-1000
    insert into t1 select '张山',-2000
    create table t2(姓名 nvarchar(10),收入 int)
    insert into t2 select '张山', 5000
    insert into t2 select '李四', 1000
    insert into t2 select '王五', 1000
    go
    select a.姓名,sum(isnull(c.收入,0)) as 总存款,sum(isnull(c.收入,0))+sum(isnull(b.支出,0)) as 余额
    from
    (select distinct 姓名 from(
    select 姓名 from t1
    union
    select 姓名 from t2
    )t
    )a left join t1 b on a.姓名=b.姓名 
    left join t2 c on a.姓名=c.姓名
    group by a.姓名
    /*
    姓名         总存款         余额
    ---------- ----------- -----------
    李四         1000        0
    王五         1000        1000
    张山         5000        3000(3 行受影响)
    */
    go
    drop table t1,t2
      

  4.   

    使用null来显示没有余额是不合理的,因为null本身代表(不知道),所以应该转换成一个已知的值,如0
    SELECT   姓名, SUM(收入) 总存款,SUM( 收入+支出  ) 余额
    FROM (           
    SELECT 姓名,0 收入,SUM(ISNULL(支出,0))支出
    FROM t1                
    GROUP BY 姓名
    UNION ALL 
    SELECT 姓名,SUM(ISNULL(收入,0))收入,0 支出
    FROM t2                
    GROUP BY 姓名)a
    GROUP BY 姓名/*
    姓名         总存款         余额
    ---------- ----------- -----------
    李四         1000        0
    王五         1000        1000
    张山         5000        3000(3 行受影响)
    */
      

  5.   

    三值逻辑:
    在SQL中逻辑表达式的取值为TRUE,FALSE,UNKNOWN.
    SQL中的UNKNOWN逻辑值通常出现在涉及NULL值的逻辑表达式中。
    UNKNOWN的反面(NOT KNOWN)是什么?
    所有的查询筛选器(on,where,having)都把UNKOWN当做FALSE来处理。CHECK约束中的UNKNOWN值实际上被当做TRUE对待.
    在筛选器中比较两个null 值将得到unkown,而unkown按false来处理,就好像其中这两个null不相等一样.
    另一方面,在unique约束,集合运算,以及排序和分组操作中,认为两个null是相等的。
    如果表中有一列定义了unique约束,将无法向表中插入该列值为null的两行.
    GROUP BY和ORDER BY 子句会将所有NULL值分到一组.
    当比较两个集合中的行时,集合运算符认为不同的NULL 值是相等的.SQL 3值逻辑。