大家好,现在小弟有一个问题需要解决。
现在有语文、数学、英语...等等不确定科目的成绩需要计算总分,注意每次考试科目不固定啊。
假如说本次考试为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