0

こんなシチュエーションがありますが、

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

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

テーブルには、学生IDと各科目のランクが表示されます。次の条件に基づいて、成績列を更新したい、

1) すべての科目ランクが 1 の場合、卒業生は A でなければなりません 2) いずれかの 3 つのランクが 1 で、他の 2 つの科目がランク 2 の場合、B 3) いずれかの 3 つのランクが 2 で、他の 2 つの科目がランク付けされている場合ランク 3、次に c

など...このように多くの条件が来る可能性があるので、解決策のアプローチを知りたいだけです。

単一のクエリを書くことは可能ですか?

4

3 に答える 3

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]

他の人が述べているように、あなたの採点基準は少しあいまいですが、私は推測しました. 異なる場合は、必要に応じて変更してください。

于 2012-07-18T18:12:33.773 に答える
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 ステートメントを変更します。きれいではありませんが、うまくいくはずです。

于 2012-07-18T14:58:52.953 に答える
0

テーブルのピボットを解除して成績を計算できます。

;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
于 2012-07-18T14:29:31.570 に答える