直奔主题吧。 SQL 语句查询问题(关于列运算):有一张表 table1 字段以及数据举例如下:(字段类型都为 数字类型)         a1     a2    a3    a4     a5     a6     a7     a8   (字段数量有时不固定)
       -----------------------------------------------------
         0       3    1     1     NULL   NULL    3     NULL
        
        NULL     1   NULL  NULL   NULL    2     NULL   NULL
        
         5     NULL  NULL   5     NULL    0     NULL    1
       
        NULL   NULL  NULL  NULL   NULL   NULL   NULL   NULL        ...   现在假如我进行列运算, 比方说我想把所有列相加, 得到一个新列 colsum
我想得到如下结果:    colsum
----------------
      8      3
      
      11      0
-----------------
由于列数量很多,而且有时候列数量不固定,所以用 case when then ...很烦琐,也不灵活。各位大侠不吝赐教!  在线急等给分~ 谢谢.

解决方案 »

  1.   

    sysobjects的sysname对应syscolumns的name   
    sysobjects的id对应syscolumns的id  在sysobjects里遍历你的表名可以得到表的列总数.然后做循环一列一列加起来就OK
      

  2.   

    //取得table1在sysobjects和syscloumns中的id  
    select id form sysobjects where name = "table1";  
    //依据上语句得到的id,从syscolumns中取出table表的列数count
    select count(name) form syscloumns where id = id;for(i=0;i<count;i++)
    {
       //your codes ;
    }
      

  3.   

    其实牵涉到的一个棘手的问题就是: 在这种列数量不固定,运算方式也不固定的情况下, 如何能把 NULL  转换成  0   这样就完美了。我知道 SQL语句里有一个比较函数:   NULLIF(x,y)  ,也就是参数 x, y 相等的时候 返回NULL 。我想,如果有个类似的方法或函数  比较 x ,y 相等时 返回0, 不等时返回 x , 那就达到目的了。   假定这个函数叫Zeroif(),那我就可以像这样做   Zeroif(x,NULL)  就不用担心在计算的时候值会变成  NULL 了。
      

  4.   

    我上面的说明已经解决了列数不固定的问题了。sysobjects和syscloumns表分别是系统为数据库对象和表列专门建立的表.从syscloumns读书的列数肯定是当前列数.列累加的时候null似乎不影响吧.再或者判断下,值为null时给它赋值为0,也不难做到.
      

  5.   

    這個可以直接在SQL中用存儲過程完成的,就沒有必要拿到程序中做了。MS  SQL中有一個函數IsNull,可以用這個函數對NULL的數據做判斷。另外,NULL對數據的累加是有影響的,NULL和數字相加的結果是NULL的。
      

  6.   

    此存儲過程能在字段数量不固定時使用--建立測試環境
    Create Table table1
    (a1 Int,
     a2 Int,
     a3 Int,
     a4 Int,
     a5 Int,
     a6 Int,
     a7 Int,
     a8 Int)
    --插入數據
    Insert table1 Select  0,   3,   1,   1,   NULL,NULL,3,   NULL
    Union All Select      NULL,1,   NULL,NULL,NULL,2,   NULL,NULL
    Union All Select      5,   NULL,NULL,5,   NULL,0,   NULL,1
    Union All Select      NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
    GO
    --建立存儲過程
    Create ProceDure Getcolsum
    As
    Begin
    Declare @S Varchar(8000)
    Set @S=''
    Select @S=@S+'+IsNull('+Name+',0)' From SysColumns Where ID=OBJECT_ID('table1') Order By ColID
    Select @S='Select '+Stuff(@S,1,1,'') +' As colsum From table1'
    EXEC(@S)
    End
    GO
    --測試
    EXEC Getcolsum
    --刪除測試環境
    Drop Table table1
    Drop ProceDure Getcolsum
    --結果
    /*
    colsum
    8
    3
    11
    0
    */
      

  7.   

    谢谢paoluo(一天到晚游泳的鱼)!我要的正是这样一个函数, 我就记得SQL应该有这样一个函数 isnull(x,y) ,这个函数提供了直接转换null为任意值! paoluo(一天到晚游泳的鱼)第一篇回复我已经茅塞顿开了,给70分,第二篇回复 写的辛苦, 再加20分。另外 谢谢(江城老温),虽然你的方法也也想到过,但效率和灵活程度原因,我没有采用,给你10分,辛苦了!