我用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