2012-07-18 89 views
0

我有這樣一個場景,如何使用tsql來計算學生的成績?

Studentid|Subject1|Subject2|Subject3|Subject4|Subject5|Grade 

    1  | 1 | 1 | 1 | 1 | 1 | 
    2  | 1 | 2 | 2 | 2 | 3 | 
    .....etc 

該表顯示,學生證和他們的排名在每個sujects.I要更新級柱,基於以下條件,

1)如果所有科目等級爲1,則等級爲A 2)如果任何3個等級爲1,其他2個等級爲2,則B 3)如果任何3等級爲2,並且其他2個等級爲3,然後c

etc ...像這樣很多條件可以come.so我只想知道解決方案離子方法。

是否可以編寫單個查詢?

+1

你能規範你的模式嗎? – RedFilter 2012-07-18 14:18:06

+1

當然,這種類型的信息不應該與列subct1,subject2等在一個表中。以這種方式進行計算要比使用規範化結構難得多。 – HLGEM 2012-07-18 14:18:39

+0

我們需要更好的要求。如果我有5個2秒怎麼辦? 4 2s和1? 4 1和2?你不能只說等,你不僅可以給出三個可能的5!+排列的要求。有沒有一個數學方程式可以避免這個問題? – 2012-07-18 14:18:40

回答

0

可以UNPIVOT表來計算等級:

;with 
Subject1 as (
    select Studentid, 1 as SubjectCode, Subject1 as subjectResult 
    from your_table 
), 
Subject2 as (
    select Studentid, 2 as SubjectCode, Subject2 as subjectResult 
    from your_table 
), 
... 
Subject5 as (
    select Studentid, 5 as SubjectCode, Subject5 as subjectResult 
    from your_table 
), 
subjects as (
    select * from Subject1 union all 
    select * from Subject2 union all 
    ... 
    select * from Subject5 

) 
select 
    Studentid, sum(subjectResult) 
from 
    subjects 
group by 
    Studentid 

請注意,在最後的選擇,你可以計算等級與case聲明。 你也可以用小的變化升級Grade柱:

...), 
subjects as (
    select * from Subject1 union all 
    select * from Subject2 union all 
    ... 
    select * from Subject5 

), 
grades as (
select 
    Studentid, sum(subjectResult) as grade 
from 
    subjects 
group by 
    Studentid 
) 
update t set grade = grades.grade 
from your_table t 
inner join grades on t.Studentid = grades.Studentid 
0

同意所有的其他意見,這是存儲數據的好辦法。但是,如果你堅持,並與它的工作,然後像這可能是工作:

UPDATE StudentsTable 
SET StudentsTable.Grade = CASE 
    WHEN Tally.Total < 8 
     THEN 'A' 
    WHEN Tally.Total < 13 
     THEN 'B' 
    ELSE 'C' 
    END 
FROM StudentsTable AS St 
JOIN (
    SELECT StudentID, 
    Subject1 + Subject2 + Subject3 + Subject4 + Subject5 AS [Total] 
FROM StudentsTable 
) AS Tally 
    ON St.StudentID = Tally.StudentID 

根據需要修改CASE語句。它不漂亮,但它應該做的伎倆。

+0

當然這是基於分數的非常基本的總結得分。如果涉及更復雜的邏輯,則需要修改(並且上述可能無法根據複雜性使用) – KrustyGString 2012-07-18 15:06:17

+0

我同意KrustyGString – NikRED 2012-07-18 16:15:16

0

我用UNPIVOT:

CREATE TABLE s 
    (
     Studentid INT , 
     Subject1 INT , 
     Subject2 INT , 
     Subject3 INT , 
     Subject4 INT , 
     Subject5 INT , 
     Grade CHAR(1) 
    ) 

INSERT INTO [s] VALUES 
( 1  , 1 , 1 , 1 , 1 , 1 , ''), 
( 2  , 1 , 2 , 2 , 2 , 3 , '') 

WITH cte AS (
SELECT u.StudentID, AVG(u.[g]) AS [grade] 
from (SELECT * FROM [s]) AS [f] 
UNPIVOT (g FOR [SUBJECT] IN (Subject1, Subject2, Subject3, Subject4, Subject5)) AS [u] 
GROUP BY u.StudentID 
) 
UPDATE [s] 
SET [Grade] = CASE 
    WHEN c.[grade] <=1 THEN 'A' 
    WHEN c.[grade] <=2 THEN 'B' 
    WHEN c.[grade] <=3 THEN 'C' 
    WHEN c.[grade] <=4 THEN 'D' 
    ELSE 'F' 
END 
FROM [cte] AS [c] 
INNER JOIN [dbo].[s] 
    ON [c].StudentId = [s].[Studentid] 

正如其他人所指出的,你的等級度量是有點曖昧,但我花了猜測。如果不同,請根據需要更改。