SQL查询问题急求解决办法

pinglan 2006-06-30 06:12:04
直奔主题吧。 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 ...很烦琐,也不灵活。

各位大侠不吝赐教! 在线急等给分~ 谢谢.
...全文
115 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
pinglan 2006-07-01
  • 打赏
  • 举报
回复
谢谢paoluo(一天到晚游泳的鱼)!

我要的正是这样一个函数, 我就记得SQL应该有这样一个函数 isnull(x,y) ,这个函数提供了直接转换null为任意值!

paoluo(一天到晚游泳的鱼)第一篇回复我已经茅塞顿开了,给70分,第二篇回复 写的辛苦, 再加20分。

另外 谢谢(江城老温),虽然你的方法也也想到过,但效率和灵活程度原因,我没有采用,给你10分,辛苦了!
paoluo 2006-07-01
  • 打赏
  • 举报
回复
此存儲過程能在字段数量不固定時使用

--建立測試環境
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
*/
paoluo 2006-07-01
  • 打赏
  • 举报
回复
這個可以直接在SQL中用存儲過程完成的,就沒有必要拿到程序中做了。

MS SQL中有一個函數IsNull,可以用這個函數對NULL的數據做判斷。

另外,NULL對數據的累加是有影響的,NULL和數字相加的結果是NULL的。
pinglan 2006-06-30
  • 打赏
  • 举报
回复
谢谢你,我试试看, 没问题我再来加分!
江城老温 2006-06-30
  • 打赏
  • 举报
回复
我上面的说明已经解决了列数不固定的问题了。sysobjects和syscloumns表分别是系统为数据库对象和表列专门建立的表.从syscloumns读书的列数肯定是当前列数.

列累加的时候null似乎不影响吧.再或者判断下,值为null时给它赋值为0,也不难做到.
pinglan 2006-06-30
  • 打赏
  • 举报
回复
其实牵涉到的一个棘手的问题就是: 在这种列数量不固定,运算方式也不固定的情况下, 如何能把 NULL 转换成 0 这样就完美了。

我知道 SQL语句里有一个比较函数: NULLIF(x,y) ,也就是参数 x, y 相等的时候 返回NULL 。

我想,如果有个类似的方法或函数 比较 x ,y 相等时 返回0, 不等时返回 x , 那就达到目的了。 假定这个函数叫Zeroif(),那我就可以像这样做 Zeroif(x,NULL) 就不用担心在计算的时候值会变成 NULL 了。
江城老温 2006-06-30
  • 打赏
  • 举报
回复
//取得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 ;
}
liberte 2006-06-30
  • 打赏
  • 举报
回复
dataset
江城老温 2006-06-30
  • 打赏
  • 举报
回复


sysobjects的sysname对应syscolumns的name
sysobjects的id对应syscolumns的id

在sysobjects里遍历你的表名可以得到表的列总数.

然后做循环一列一列加起来就OK

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧