首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

语文数学英语相加求总分的有关问题

2013-02-04 
语文数学英语相加求总分的问题大家好,现在小弟有一个问题需要解决。现在有语文、数学、英语...等等不确定科目

语文数学英语相加求总分的问题
大家好,现在小弟有一个问题需要解决。
现在有语文、数学、英语...等等不确定科目的成绩需要计算总分,注意每次考试科目不固定啊。

假如说本次考试为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)





热点排行
Bad Request.