日期:2014-05-17  浏览次数:20522 次

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

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