我用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]
正如其他人所指出的,你的等級度量是有點曖昧,但我花了猜測。如果不同,請根據需要更改。
你能規範你的模式嗎? – RedFilter 2012-07-18 14:18:06
當然,這種類型的信息不應該與列subct1,subject2等在一個表中。以這種方式進行計算要比使用規範化結構難得多。 – HLGEM 2012-07-18 14:18:39
我們需要更好的要求。如果我有5個2秒怎麼辦? 4 2s和1? 4 1和2?你不能只說等,你不僅可以給出三個可能的5!+排列的要求。有沒有一個數學方程式可以避免這個問題? – 2012-07-18 14:18:40