如何在SQL Server

时间:2017-12-22 15:18:15

标签: sql sql-server-2008 sql-server-2012 sql-server-2008-r2

我有一张表tbl_Marks

Std_id  | sub_id  |  term_I   | term_2
--------+---------+-----------+-------
std_1   | 1       |   40      | 50
std_1   | 2       |   30      | 40
std_1   | 3       |   20      | 30
std_1   | 4       |   10      | 50

std_2   | 1       |   50      | 50
std_2   | 2       |   50      | 50
std_2   | 3       |   50      | 50
std_2   | 4       |   50      | 50

我怎样才能得到这样的结果:

Std_id  | sub_id  |  term_I   | term_2 | total  | status | PROMOTION_status
--------+---------+-----------+--------+--------+--------+------------------
std_1   | 1       |   40      | 50     | 90     | PASS   | REPEATER
std_1   | 2       |   30      | 40     | 70     | PASS   | REPEATER
std_1   | 3       |   20      | 20     | 40     | FAIL   | REPEATER
std_1   | 4       |   10      | 50     | 60     | PASS   | REPEATER

注意:如果总值小于任何sub_id

的50
std_2   | 1       |   50      | 50     | 100    | PASS   | PROMOTED
std_2   | 2       |   50      | 50     | 100    | PASS   | PROMOTED
std_2   | 3       |   50      | 50     | 100    | PASS   | PROMOTED
std_2   | 4       |   50      | 50     | 100    | PASS   | PROMOTED

注意:如果总值大于50或等于每个sub_id

请帮忙!

2 个答案:

答案 0 :(得分:1)

使用CASE

 select t.*,
        t.term_I + t.term_2 as total,
        case when t.term_I + t.term_2 >= 50 then 'pass' else 'fail' end as status,
        case when t.std_id = 'std_2' then 'PRMOTED' else 'REAPEATER' end as promotion_status
 from tbl_marks t

答案 1 :(得分:0)

以下SQL Select语句可以提供帮助 您也可以使用子选择语句代替SQL CTE expression 但是这个查询的主要技巧是使用MIN aggregation function with Partition by子句 这有助于您检查该学生是否有低于50分的分数,如果是这样,它将该学生的所有记录作为REPEATER状态

;with cte as (
select  
*, 
term_1 + term_2 as total
from tbl_Marks
)
select
*,
case when (term_1 + term_2) >= 50 then 'PASS' else 'FAIL' end as status,
case when (
min(total) over (partition by Std_id)
) >= 50 then 'PROMOTED' else 'REPEATER' end as PROMOTION_status
from cte

我希望它有所帮助,

enter image description here