语文数学英语相加求总分的问题
大家好,现在小弟有一个问题需要解决。
现在有语文、数学、英语...等等不确定科目的成绩需要计算总分,注意每次考试科目不固定啊。
假如说本次考试为3科
成绩如下
考号 语文 数学 英语 总分
1 50 null 90
2 null 80 70
3 50 80 null
4 null null null
5 0 0 0
看上面如果某科成绩为null 则说明该科学生为缺考
请问如何来求出上面的总分来呢。
我想到的是这样写
update 表t set 总分=isnull(语文,0)+isnull(数学,0)+isnull(英语,0)
但是有两个问题,
1、科目不确定的情况下我如何来拼凑出这个sql语句
2、如果所有的科目都为null的话(如上面考号为4的学生)那么应该删除他的成绩。
这个怎么判断所有科都等于null。
最好能用一句sql来计算,如果不行,存储过程也行。
就剩下这么多分,等明天有了再加,谢谢
[解决办法]
----------------------------
-- Author :磊仔
-- Date :2013-01-26 12:43:10
-- Version:
-- Microsoft SQL Server 2008 (SP2) - 10.0.4000.0 (Intel X86)
--Sep 16 2010 20:09:22
--Copyright (c) 1988-2008 Microsoft Corporation
--Enterprise Edition on Windows NT 6.1 <X86> (Build 7600: )
--
----------------------------
--> 测试数据:#TA
if object_id('tempdb.dbo.#TA') is not null drop table #TA
go
create table #TA([考号] int,[语文] int,[数学] int,[英语] int,[总分] sql_variant)
insert #TA
select 1,50,null,90,null union all
select 2,null,80,70,null union all
select 3,50,80,null,null union all
select 4,null,null,null,null union all
select 5,0,0,0,null
--------------开始查询--------------------------
UPDATE A SET
[总分] = B.x.value('sum(//row/*)','int') - [考号]
FROM #TA AS A
CROSS APPLY (SELECT x = (SELECT A.* FOR XML PATH('row'),TYPE)) AS B;
SELECT * FROM #TA;
----------------结果----------------------------
/*
考号 语文 数学 英语 总分
----------- ----------- ----------- ----------- --------
1 50 NULL 90 140
2 NULL 80 70 150
3 50 80 NULL 130
4 NULL NULL NULL 0
5 0 0 0 0
(5 行受影响)
*/
--创建测试表
create table scores(kh int,chinese int,maths int,english int,total int)
--插入数据
drop table scores
insert into scores
select 1,50,null,90,''
union all
select 2,null,80,70,''
union all
select 3,50,80,null,''
union all
select 4,null,null,null,null
union all
select 5,0,0,0,null
2、如果所有的科目都为null的话(如上面考号为4的学生)那么应该删除他的成绩。
delete from scores where coalesce(chinese,maths,english) is null
1、科目不确定的情况下我如何来拼凑出这个sql语句
declare @col varchar(8000)
set @col=''
declare @sql varchar(8000)
set @sql='update scores set total= '
select @col=@col+'+'+' isnull('+name+',0)' from syscolumns where id=object_id('scores') and name not in ('kh','total') order by colid
set @sql=@sql+stuff(@col,1,1,'')
exec(@sql)