SQL data completion problem

1. Create data

DROP TABLE IF EXISTS sc;
CREATE TABLE sc (
	stu_no 	  VARCHAR(4) COMMENT '学号',
	class_no  VARCHAR(4) COMMENT '课程号',
	grade     INT(2)     COMMENT '成绩' 
);

DROP TABLE IF EXISTS class;
CREATE TABLE class (
	class_no   VARCHAR(4) COMMENT '课程号',
	class_name VARCHAR(8) COMMENT '课程名称'
);


INSERT INTO sc VALUES 
('0001','C001',89),
('0001','C002',85),
('0001','C003',99),
('0002','C001',78),
('0002','C002',83),
('0002','C003',86),
('0002','C004',77),
('0003','C001',88),
('0003','C003',68),
('0003','C004',55);

INSERT INTO class VALUES 
('C001','语文'),
('C002','数学'),
('C003','英语'),
('C004','科学');

Second, view the data structure

SELECT * FROM sc;
SELECT * FROM class;

Insert picture description here
Insert picture description here

3. Requirements (check out the score of each student for each course, if the student does not have a score for that course in the database, then the score for that course is set to 0)

  • 1. Use cross join to do Cartesian product on two tables.

    SELECT * 
    FROM sc
    CROSS JOIN class
    
    +--------+----------+-------+----------+------------+
    | stu_no | class_no | grade | class_no | class_name |
    +--------+----------+-------+----------+------------+
    | 0001   | C001     |    89 | C001     | 语文       |
    | 0001   | C001     |    89 | C002     | 数学       |
    | 0001   | C001     |    89 | C003     | 英语       |
    | 0001   | C001     |    89 | C004     | 科学       |
    | 0001   | C002     |    85 | C001     | 语文       |
    | 0001   | C002     |    85 | C002     | 数学       |
    | 0001   | C002     |    85 | C003     | 英语       |
    | 0001   | C002     |    85 | C004     | 科学       |
    | 0001   | C003     |    99 | C001     | 语文       |
    | 0001   | C003     |    99 | C002     | 数学       |
    | 0001   | C003     |    99 | C003     | 英语       |
    | 0001   | C003     |    99 | C004     | 科学       |
    | 0002   | C001     |    78 | C001     | 语文       |
    | 0002   | C001     |    78 | C002     | 数学       |
    | 0002   | C001     |    78 | C003     | 英语       |
    | 0002   | C001     |    78 | C004     | 科学       |
    | 0002   | C002     |    83 | C001     | 语文       |
    | 0002   | C002     |    83 | C002     | 数学       |
    | 0002   | C002     |    83 | C003     | 英语       |
    | 0002   | C002     |    83 | C004     | 科学       |
    | 0002   | C003     |    86 | C001     | 语文       |
    | 0002   | C003     |    86 | C002     | 数学       |
    | 0002   | C003     |    86 | C003     | 英语       |
    | 0002   | C003     |    86 | C004     | 科学       |
    | 0002   | C004     |    77 | C001     | 语文       |
    | 0002   | C004     |    77 | C002     | 数学       |
    | 0002   | C004     |    77 | C003     | 英语       |
    | 0002   | C004     |    77 | C004     | 科学       |
    | 0003   | C001     |    88 | C001     | 语文       |
    | 0003   | C001     |    88 | C002     | 数学       |
    | 0003   | C001     |    88 | C003     | 英语       |
    | 0003   | C001     |    88 | C004     | 科学       |
    | 0003   | C003     |    68 | C001     | 语文       |
    | 0003   | C003     |    68 | C002     | 数学       |
    | 0003   | C003     |    68 | C003     | 英语       |
    | 0003   | C003     |    68 | C004     | 科学       |
    | 0003   | C004     |    55 | C001     | 语文       |
    | 0003   | C004     |    55 | C002     | 数学       |
    | 0003   | C004     |    55 | C003     | 英语       |
    | 0003   | C004     |    55 | C004     | 科学       |
    +--------+----------+-------+----------+------------+
    
    
  • 2. Set the two data rows with unequal class_no in the above table, and set grade to 0

    SELECT 
    	stu_no,
    	t1.class_no,
    	t2.class_no,
    	CASE 
    		WHEN t1.class_no=t2.class_no THEN grade 
    	ELSE 0 END AS grade,
    	class_name 
    FROM sc AS t1 
    CROSS JOIN class AS t2
    
    		+--------+----------+----------+-------+------------+
    | stu_no | class_no | class_no | grade | class_name |
    +--------+----------+----------+-------+------------+
    | 0001   | C001     | C001     |    89 | 语文       |
    | 0001   | C001     | C002     |     0 | 数学       |
    | 0001   | C001     | C003     |     0 | 英语       |
    | 0001   | C001     | C004     |     0 | 科学       |
    | 0001   | C002     | C001     |     0 | 语文       |
    | 0001   | C002     | C002     |    85 | 数学       |
    | 0001   | C002     | C003     |     0 | 英语       |
    | 0001   | C002     | C004     |     0 | 科学       |
    | 0001   | C003     | C001     |     0 | 语文       |
    | 0001   | C003     | C002     |     0 | 数学       |
    | 0001   | C003     | C003     |    99 | 英语       |
    | 0001   | C003     | C004     |     0 | 科学       |
    | 0002   | C001     | C001     |    78 | 语文       |
    | 0002   | C001     | C002     |     0 | 数学       |
    | 0002   | C001     | C003     |     0 | 英语       |
    | 0002   | C001     | C004     |     0 | 科学       |
    | 0002   | C002     | C001     |     0 | 语文       |
    | 0002   | C002     | C002     |    83 | 数学       |
    | 0002   | C002     | C003     |     0 | 英语       |
    | 0002   | C002     | C004     |     0 | 科学       |
    | 0002   | C003     | C001     |     0 | 语文       |
    | 0002   | C003     | C002     |     0 | 数学       |
    | 0002   | C003     | C003     |    86 | 英语       |
    | 0002   | C003     | C004     |     0 | 科学       |
    | 0002   | C004     | C001     |     0 | 语文       |
    | 0002   | C004     | C002     |     0 | 数学       |
    | 0002   | C004     | C003     |     0 | 英语       |
    | 0002   | C004     | C004     |    77 | 科学       |
    | 0003   | C001     | C001     |    88 | 语文       |
    | 0003   | C001     | C002     |     0 | 数学       |
    | 0003   | C001     | C003     |     0 | 英语       |
    | 0003   | C001     | C004     |     0 | 科学       |
    | 0003   | C003     | C001     |     0 | 语文       |
    | 0003   | C003     | C002     |     0 | 数学       |
    | 0003   | C003     | C003     |    68 | 英语       |
    | 0003   | C003     | C004     |     0 | 科学       |
    | 0003   | C004     | C001     |     0 | 语文       |
    | 0003   | C004     | C002     |     0 | 数学       |
    | 0003   | C004     | C003     |     0 | 英语       |
    | 0003   | C004     | C004     |    55 | 科学       |
    +--------+----------+----------+-------+------------+
    		
    
  • 3. Observing the data in the previous step, it is not difficult to find that we have completed the missing course scores of each student with 0, but the original normal data has repeated some course data with 0, so we need to remove the duplicates and go The most important thing is to use group by or distinct, but distinct is not controllable, so we choose group by here to reproduce the data we want.

    SELECT 
    	stu_no,
    	t2.class_no,
    	SUM(CASE 
    		WHEN t1.class_no=t2.class_no THEN grade 
    		ELSE 0 
    		END
    		) AS grade,
    	class_name 
    FROM sc AS t1 
    CROSS JOIN class AS t2
    GROUP BY stu_no,t2.class_no,class_name;
    

Insert picture description here

Guess you like

Origin blog.csdn.net/qq_42359956/article/details/109258786