Advertisement
Guest User

zcw

a guest
Apr 6th, 2020
222
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MySQL 3.02 KB | None | 0 0
  1. alter table takes
  2.     add column score numeric(5, 2) null;
  3.  
  4. create function grade_to_score(grade varchar(2)) returns integer deterministic
  5. begin
  6.     declare score integer;
  7.     select (case
  8.                 when grade = 'A+' then 100
  9.                 when grade = 'A' then 94
  10.                 when grade = 'A-' then 89
  11.                 when grade = 'B+' then 84
  12.                 when grade = 'B' then 79
  13.                 when grade = 'B-' then 74
  14.                 when grade = 'C+' then 70
  15.                 when grade = 'C' then 67
  16.                 when grade = 'C-' then 64
  17.                 when grade = 'D' then 61
  18.                 else 59 end)
  19.     into score;
  20.     return score;
  21. end;
  22.  
  23. create function grade_to_point(grade varchar(2)) returns decimal deterministic
  24. begin
  25.     declare score integer;
  26.     select (case
  27.                 when grade = 'A+' then 4.3
  28.                 when grade = 'A' then 4.0
  29.                 when grade = 'A-' then 3.7
  30.                 when grade = 'B+' then 3.3
  31.                 when grade = 'B' then 3.0
  32.                 when grade = 'B-' then 2.7
  33.                 when grade = 'C+' then 2.3
  34.                 when grade = 'C' then 2.0
  35.                 when grade = 'C-' then 1.7
  36.                 when grade = 'D' then 1.0
  37.                 else 0.0 end)
  38.     into score;
  39.     return score;
  40. end;
  41.  
  42. create procedure compute_student_gpa_avg_score(in ID varchar(5), out gpa numeric(3, 2), out score numeric(5, 2)) deterministic
  43. begin
  44.     select (sum(powered_score) / sum(credits)), sum(powered_point) / sum(credits)
  45.     into score,gpa
  46.     from (select credits,
  47.                  grade_to_score(grade) * credits as powered_score,
  48.                  grade_to_point(grade) * credits as powered_point
  49.           from takes
  50.                    join course using (course_id)
  51.           where takes.ID = ID
  52.          ) as stat;
  53. end;
  54.  
  55. create trigger compute_insert_score
  56.     before insert
  57.     on takes
  58.     for each row
  59. begin
  60.     if NEW.score is null
  61.     then
  62.         set NEW.score = grade_to_score(NEW.grade);
  63.     end if;
  64. end;
  65.  
  66. create trigger compute_update_score
  67.     before update
  68.     on takes
  69.     for each row
  70. begin
  71.     set NEW.score = grade_to_score(NEW.grade);
  72. end;
  73.  
  74. create table gpa_avg_score_stat
  75. (
  76.     ID        varchar(5),
  77.     gpa       numeric(3, 2) null,
  78.     avg_score numeric(5, 2) null,
  79.     primary key (ID),
  80.     foreign key (ID) references student (ID)
  81. );
  82.  
  83. create procedure init_stat() not deterministic
  84. begin
  85.     declare id_done int default false;
  86.     declare cur_id varchar(5);
  87.     declare ids cursor for select distinct ID from takes;
  88.     declare continue handler for not found set id_done = true;
  89.     open ids;
  90.     process_id_init:
  91.     loop
  92.         begin
  93.             fetch ids into cur_id;
  94.             call compute_student_gpa_avg_score(cur_id, @gpa, @avg_score);
  95.             insert into gpa_avg_score_stat value (cur_id, @gpa, @avg_score);
  96.             commit;
  97.         end;
  98.         if id_done then
  99.             leave process_id_init;
  100.         end if;
  101.     end loop;
  102. end;
  103.  
  104.  
  105. call init_stat();
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement