sql本身有统计功能如平均值等,也能自动屏蔽NUll
但要是在程序计算中屏蔽null值怎么处理?
比如一个字段,100条记录,我要算平均值,首先要读取数据赋值到数组,但null如何处理,即使处理成0也不合适

解决方案 »

  1.   

    那你需要处理成什么值才合适?还是不处理这条记录?如果不处理,着在查询时筛选掉.select * from tb where col is not null
      

  2.   

    use test
    go
    if object_id('test.dbo.tb') is not null drop table tb
    -- 创建数据表
    create table tb
    (
    num int
    )
    go
    --插入测试数据
    insert into tb select 3
    union all select 2
    union all select null
    union all select 1
    go
    --代码实现select num_avg=avg(cast(num as float)) from tb   --不将null作为记录统计/*测试结果num_avg
    ------------------
    2(3 行受影响)
    */select num_avg=avg(cast(isnull(num,0) as float)) from tb   --将null作为记录统计
    /*测试结果num_avg
    ------------------
    1.5(3 行受影响)
    */
      

  3.   

    我的要求可能特殊了点,但是确实是这么个问题
    我用的是一条记录内部的数据,大概30个字段,通过查询每个字段赋值到数组中,假如遇到空的我现在是处理成0,但这样得出的数值时不争取的,比如有6个字段为null,这些0参与计算式不正确的,本来只要除以24,现在是除以30,困扰
      

  4.   

    "比如一个字段,100条记录,我要算平均值,首先要读取数据赋值到数组,但null如何处理,即使处理成0也不合适"最关键是楼主先要明确null值这一条记录的意义,比如,学生成绩允许为空时,但学生是要计数的,当然这条记录就得算在其中注意:聚合函数sum会自动消除null值,即不用isnull(fvalue,0)也可以,但count(fvalue)是不会消除的,否则这条没成绩的学生不是不算了如是普通查询条件的排除,直接isnull()处理了,
      

  5.   

    比如有6个字段为null,这些0参与计算式不正确的,本来只要除以24,现在是除以30具体给个实例,直接一句除以24变成除以30谁知道是什么注意楼主说的是6个字段,就是test(t1,t2,t3,....)???还是取出的6条记录中同一个字段的值
      

  6.   

    在程序取数据的时候先过滤掉null
    where 字段 is not null
      

  7.   

    抱歉,可能没表达清楚,例子如下,我通过条件可以查询一条记录
    ID    hole1   hole2  hole3  hole4  hole5 ……………… hole30
    1001  11.2    12.4   null  14.6   17.8               12.6我需要统计的是hole1 到hole  30的平均值,其中有几个字段是null,如何处理?
      

  8.   

    数据库处理不就完了吗
    select ID, avg(hole1) from 
    (
    select ID,hole1 from tb union all
    select ID,hole2 from tb union all
    select ID,hole3 from tb union all
    select ID,hole4 from tb union all
    select ID,hole5 from tb union all
    ………………
    select ID,hole30 from tb
    ) as t
    group by ID
      

  9.   

    呵呵,很久没看恐怖片子了,胆小。正题:数据库计算avg-- 测试数据:#
    if object_id('tempdb.dbo.#') is not null drop table #
    create table #(id int, hole1 float, hole2 float, hole3 float)
    insert into #
    select 1001, null, 9, 2 union all
    select 1002, 3, null, 7 union all
    select 1003, 8, 1, nullselect *, [avg] =
    (
        select avg(hole1) from
        (
            select hole1 union all
            select hole2 union all
            select hole3
        ) t
    )
    from #/*
    id          hole1                  hole2                  hole3                  avg
    ----------- ---------------------- ---------------------- ---------------------- ----------------------
    1001        NULL                   9                      2                      5.5
    1002        3                      NULL                   7                      5
    1003        8                      1                      NULL                   4.5
    */
      

  10.   


    要么列转行,只有id,hole两行,,select id,count(distinct hole) from tb group by id统计个数;sum(case  when hole1 is null then 0 else 1 end +case  when hole2 is null then 0 else 1 end......)
      

  11.   

       你的问题不明确,例如三个数据:4,null,8;一般说null值不纳入平均计算,2个数据,总和是12,平均是6.如果你要求null值按0纳入平均计算,3个数据,总和12,平均为 4.
       你的要求就是算法,有了你的算法才可能用SQL语句实现。
       
      

  12.   

    null和‘’要采取不同的处理策略
      

  13.   

    你的问题不明确,例如三个数据:4,null,8;一般说null值不纳入平均计算,2个数据,总和是12,平均是6.如果你要求null值按0纳入平均计算,3个数据,总和12,平均为 4.
      你的要求就是算法,有了你的算法才可能用SQL语句实现。
      **********************
    还要补充一句话:null值的含义是空缺;4,null,8三个数值的平均值也应该为空缺 null。
      

  14.   

    isnull() 第一个参数为null则替换成第二个值