2 zqh0922 zqh0922 于 2016.01.22 20:36 提问

sql 行列转换时,空值如何设置成0

在用Sql静态方法进行行列转换时,数据库存在的空值如何处理?我想空值变为0.
create table tb(姓名 varchar(10) , 学号 varchar(10), 课程 varchar(10) , 分数 int)
insert into tb values('张三' ,'123456', '语文' , 74)
insert into tb values('张三' ,'123456', '数学' , 83)
insert into tb values('张三' , '123459','物理' , 93)
insert into tb values('李四' , '123457','语文' , 74)
insert into tb values('李四' , '123457','数学' , 84)
insert into tb values('李四' , '123457','物理' , 94)
insert into tb values('李四' , '123458','语文' , 74)
insert into tb values('李四' , '123458','数学' , 84)
insert into tb values('李四' , '123458','地理' , 94)
go

select m.* , n.总分
from(select * from (select * from tb) a pivot (max(分数) for 课程 in (语文,数学,地理,物理,几何,生物,化学)) b) m,
(select 学号 , sum(分数) AS 总分 from tb group by 学号) n
where m.学号= n.学号
go
因为生成这个报表的时候,我想让使用者可以设置,即“语文,数学,地理,物理,几何,生物,化学”,可以在TextBox中设置,我已经实现了。但是在行列转换后,会出现很多空值,在后续的处理,如求取单科的平均成绩时,空值就不会参与计算,所以需要将空值变为0.因为课程可能会变的原因“语文,数学,地理,物理,几何,生物,化学”可能会改变,因此不能用ISNULL(字段值,0)来改,因为不知道字段值是多少。

4个回答

jiuwohuge
jiuwohuge   2016.01.29 11:47
已采纳

不行加个临时字段,弄个触发器。专门用来生成报表使用,null字段直接保存为0

caozhy
caozhy   Ds   Rxr 2016.01.22 20:53

再select一次,
(select isnull(字段名),0) as 字段名

zqh0922
zqh0922 回复caozhy: 我说了,不能用ISNULL,因为不知道有哪些课程名称,有可能是数学,语文,英语;也可能是数学,语文,英语,地理。
2 年多之前 回复
caozhy
caozhy   Ds   Rxr 2016.01.22 21:19

放入临时表,用下面的方法得到列名
http://www.cnblogs.com/yansheng/archive/2010/03/30/1700755.html

zqh0922
zqh0922 回复caozhy: 我想有没有方法在行列转换时,自动就把空值变为0了
2 年多之前 回复
enpterexpress
enpterexpress   Rxr 2016.01.22 22:57

用isnull函数
isnull(<字段名>,0)

zqh0922
zqh0922 回复人帅屌大惹人爱: Isnull的话,需要知道字段名,但是我的课程是一直在变。也就是in (语文,数学,英语,地理,物理,化学)这个里面是在变的。我在C#里面的窗体textbox里面让老师可以设置需要导出的课程。其实我是知道课程的,从textbox里面可以知道。但是具体怎么写sql语句,从textbox里面得到的内容得到isnull语句?谢谢!
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
用SQL实现行列转换的一个例子
在CU上看到一个问题。 http://bbs.chinaunix.net/
SQL中 常用的处理方法(处理空值、更新字段、去掉小数后的0、查询重复列)
 -- 一: 处理未查到的空值 select case when exists(select EndPrice from T_stock where BOMSN=0109) then (select EndPrice from T_stock where BOMSN=0109) else 0 end --二:更新字段值  --strNum 数量 --
sql空值值转化为0
sqlserver 用 isnull (a,0) 的函数 oracle 用 nvl( a, 0) 的函数 通用的是 case when a is null then 0 else a end 的写法 g
SQl Server 在SELECT语句中怎么把空值转换成零来计算?
一表中有两个字段a和b,a中都有数据,b中有的行有数据,有的是空 现在select   sum(a-b)时,凡是b是空的,都sum不出来请问,若不想强制把b字段中的空值都赋成零,怎么才能把空值在语句中转换成零来计算? 
sql查询数值为null时处理成0
在遇到多张表查询时,很可能查一个关联数值时,并没有这条关联记录,所以查询到的结果是null,通常需要把这个结果处理成0或者其他。 这时候就用isNULL(字段,0) 如: select car_repair.supplier_name , isNULL(sum(car_repair.tocal_maintain_money),0)+isNULL(sum(car_repair_work_h
SQL语言做加减运算时将某项的null值转换为0
在SQL语言中,很多时候,在表项中会遇到null值,null值有三大特点:1)NULL值不参加统计;2)NULL值不进入计算表达式;3)不能与其它值进行比较。 因此,在运算中要将null值有时候转换成其他值,这里提供一种加减运算中转换为0的方法。         如:在算工资的时候,总工资=基础工资+奖金,但有的员工奖金为null,因此:(这里用的scott表里的数据,comm表示奖金,sal
Sql实现行列转换
从MS Sql Server 2005微软就推出了pivot和unpivot实现行列转换,这极大的方便了我们存储数据和呈现数据。今天就对这两个关键字进行分析,结合实例讲解如何存储数据,如何呈现数据。
sql中对于null的处理方法
1、缺省处理 Oracle在Order by 时缺省认为null是最大值,所以如果是ASC升序则排在最后,DESC降序则排在最前   2、使用nvl函数 nvl函数可以将输入参数为空时转换为一特定值,如nvl(employee_name,’张三’)表示当employee_name为空时则返回’张三’,如果不为空则返回employee_name通过这个函数可以定制null的排序位置。
sql实现行列转换
postgresql 现有一个表如(表一)想要转换为(表二) sql:select stuName as 姓名,chinese as 语文,math as 数学,english as 英文 from(
如何用SQL语句实现行列转换
如何用SQL语句实现行列转换行列转换是数据库系统中经常遇到的一个需求,在数据库设计时,为了适合数据的累积存储,往往采用直接记录的方式,而在展示数据时,则希望整理所有记录并且转置显示。图9.1展示了行列转换的功能。 图9.1  行列转换的需求分析这个需求,可以发现希望做的是找出具有相同部门的记录,并根据其材料的值累加数量。如果手动来写的话,最终希望得到