From 4a1dbce186936bf864190290860c74838f598218 Mon Sep 17 00:00:00 2001 From: TU HO Date: Fri, 26 May 2023 10:23:25 +0700 Subject: [PATCH] completed homework --- capital_gain_loss.sql | 7 ++ count_salary_categories.sql | 49 +++++++++++ mission2.sql | 165 ++++++++++++++++++++++++++++++++++++ 3 files changed, 221 insertions(+) create mode 100644 capital_gain_loss.sql create mode 100644 count_salary_categories.sql create mode 100644 mission2.sql diff --git a/capital_gain_loss.sql b/capital_gain_loss.sql new file mode 100644 index 0000000..5400d01 --- /dev/null +++ b/capital_gain_loss.sql @@ -0,0 +1,7 @@ +SELECT + stock_name, + SUM(CASE WHEN operation = 'Sell' THEN price ELSE -price END) AS capital_gain_loss +FROM + stocks +GROUP BY + stock_name; diff --git a/count_salary_categories.sql b/count_salary_categories.sql new file mode 100644 index 0000000..ad155a3 --- /dev/null +++ b/count_salary_categories.sql @@ -0,0 +1,49 @@ + +-- cách 1 (cần insert thêm 3 row data, chạy đc ở dev k chạy đc ở leetcode) + +insert into Accounts(account_id, income, category) values +(-1, 0,null), +(-1, 20001, null), +(-1, 50001, null); + +select +case + when income <20000 then 'Low Salary' + when income >50000 then 'High Salary' + else 'Average Salary' +end as category, +count(*) -1 as accounts_count +from Accounts +group by +CASE + WHEN income < 20000 THEN 'Low Salary' + WHEN income > 50000 THEN 'High Salary' + ELSE 'Average Salary' + END; + +-- cách 2(chạy đươc trên leetcode k cần insert ) + +SELECT + c.category + , COUNT(a.income) AS accounts_count +FROM + ( + SELECT 'Low Salary' AS category + UNION ALL + SELECT 'Average Salary' AS category + UNION ALL + SELECT 'High Salary' AS category + ) c +LEFT JOIN + accounts a ON ( + (c.category = 'Low Salary' AND a.income < 20000) OR + (c.category = 'Average Salary' AND a.income >= 20000 AND a.income <= 50000) OR + (c.category = 'High Salary' AND a.income > 50000) + ) +GROUP BY + c.category + + + + + diff --git a/mission2.sql b/mission2.sql new file mode 100644 index 0000000..34039c4 --- /dev/null +++ b/mission2.sql @@ -0,0 +1,165 @@ + +-- create tables +CREATE TABLE IF NOT EXISTS professor ( + id INT PRIMARY KEY, + firstName VARCHAR(50) NOT NULL, + lastName VARCHAR(50) NOT NULL + +); + +CREATE TABLE IF NOT EXISTS course ( + id INT PRIMARY KEY, + name VARCHAR(50) NOT NULL +); + + +CREATE TABLE IF NOT EXISTS student ( + id INT PRIMARY KEY, + firstName VARCHAR(50) NOT NULL, + lastName VARCHAR(50) NOT NULL, + street varchar(255), + city varchar(50), + zip varchar(10) +); + +CREATE TABLE IF NOT EXISTS class ( + id INT PRIMARY KEY, + name VARCHAR(50) NOT NULL, + professor_id INT NOT NULL, + course_id INT NOT NULL, + room_id INT NOT NULL, + FOREIGN KEY (professor_id) REFERENCES professor(id), + FOREIGN KEY (course_id) REFERENCES course(id) + -- FOREIGN KEY (room_id) REFERENCES room(id) +); + + +CREATE TABLE IF NOT EXISTS room ( + id INT PRIMARY KEY, + name VARCHAR(50) NOT NULL, + loc varchar(50), + cap varchar(50), + class_id INT UNIQUE NOT NULL, + FOREIGN KEY (class_id) REFERENCES class(id) +); + +-- vì đây là quan hệ n-n nên không khai báo fk trong cả 2 đc vì chạy k đc, nên bỏ 1 trong 2 tạo bảng rồi mới add fk +alter table class +add constraint class_room +foreign key(room_id) references room(id); + + +CREATE TABLE IF NOT EXISTS class_student ( + class_id INT NOT NULL, + student_id INT NOT NULL, + + grade varchar(3), + PRIMARY KEY (class_id, student_id), + FOREIGN KEY (class_id) REFERENCES class(id), + FOREIGN KEY (student_id) REFERENCES student(id) +); + +-- những cặp student-professor có dạy học nhau và số lớp mà họ có liên quan +-- tạo thêm table class_professor để tối ưu query + +CREATE TABLE IF NOT EXISTS class_professor ( + class_id INT NOT NULL, + professor_id INT NOT NULL, + PRIMARY KEY (class_id, professor_id), + FOREIGN KEY (class_id) REFERENCES class(id), + FOREIGN KEY (professor_id) REFERENCES professor(id) +); + + +select t.id as student_id, t.lastName as student_name, + p.id as professor_id, p.lastName as professor_name, + count(distinct(class_id)) as numClass +from student as t +join class_student as c_s +on t.id= c_s.student_id +join class_professor as c_f +on c_s.class_id= c_f.class_id +join professor as p +on c_f.professor_id= p.id +group by student_id,professor_id; + + +-- những course (distinct) mà 1 professor cụ thể đang dạy + +select p.id, c.course_id + +from professor as p +join class as c on p.id= c.professor_id +group by p.id, c.course_id; + + +-- những course (distinct) mà 1 student cụ thể đang học +SELECT s.id AS student_id, c.name AS course_name +FROM class c +JOIN class_student cs ON c.id = cs.class_id +JOIN student s ON cs.student_id = s.id +GROUP BY student_id, course_name; + + +-- điểm số là A, B, C, D, E, F tương đương với 10, 8, 6, 4, 2, 0 +-- điểm số trung bình của 1 học sinh cụ thể (quy ra lại theo chữ cái, và xếp loại học lực (weak nếu avg < 5, average nếu >=5 < 8, good nếu >=8 ) + +SELECT cs.student_id, + AVG(CASE + WHEN cs.grade =10 THEN 'A' + WHEN cs.grade >= 8 THEN 'B' + WHEN cs.grade >= 6 THEN 'C' + WHEN cs.grade >= 4 THEN 'D' + WHEN cs.grade >= 2 THEN 'E' + ELSE 'F' + END) AS letter_grade, + CASE + WHEN AVG(cs.grade) < 5 THEN 'weak' + WHEN AVG(cs.grade) < 8 THEN 'average' + ELSE 'good' + END AS performance_level +FROM class_student cs +group by cs.student_id; + +-- điểm số trung bình của các class (quy ra lại theo chữ cái) + +SELECT c.id AS class_id, c.name AS class_name, + AVG(CASE + WHEN cs.grade =10 THEN 'A' + WHEN cs.grade >= 8 THEN 'B' + WHEN cs.grade >= 6 THEN 'C' + WHEN cs.grade >= 4 THEN 'D' + WHEN cs.grade >= 2 THEN 'E' + ELSE 'F' + END) AS letter_grade +FROM class c +JOIN class_student cs ON c.id = cs.class_id +GROUP BY class_id, class_name; + +-- điểm số trung bình của các course (quy ra lại theo chữ cái) + +SELECT c.course_id AS course_id, + AVG(CASE + WHEN cs.grade =10 THEN 'A' + WHEN cs.grade >= 8 THEN 'B' + WHEN cs.grade >= 6 THEN 'C' + WHEN cs.grade >= 4 THEN 'D' + WHEN cs.grade >= 2 THEN 'E' + ELSE 'F' + END) AS letter_grade +FROM class c +JOIN class_student cs ON c.id = cs.class_id +GROUP BY course_id + + + + + + + + + + + + +