I'm fairly new to SQL and completely self-taught, so I apologize ahead of time! My situation is we have a table that contains a student's plan of courses they should take for each quarter (table E) and a table of courses a student has actually taken (table R).
TABLE E
EMPLID | ID | QTR | SUBJ | COURSE_NUM
11111 | 1 | 2213 | HCML | 325
11111 | 1 | 2213 | HPM | 340
11111 | 1 | 2215 | CMST | 330
22222 | 1 | 2213 | ART | 110
22222 | 1 | 2213 | GENERAL | 1
22222 | 1 | 2213 | GENERAL | 5
TABLE R
EMPLID | QTR | SUBJ | COURSE_NUM
11111 | 2213 | CMST | 330
11111 | 2213 | HCML | 325
11111 | 2215 | HPM | 340
22222 | 2213 | ART | 105
22222 | 2213 | ENGL | 201
22222 | 2213 | ASTR& | 101
In table E there can also be placeholder courses listed as "GENERAL" that can map to a large set of courses defined in table G. So if a student has "GENERAL 1" on their plan, and they take any of the courses in table G marked with a 1, it should count as a match.
TABLE G
SUBJ | NUM | MAPPING
ENGL& | 101 | 1
ENGL | 201 | 1
ENGL& | 235 | 1
ANTH& | 215 | 5
ASTR& | 101 | 5
BIOL | 108 | 5
I've managed to make the first part work, but I'm completely stuck on how I would do the mapping of these GENERAL courses. Instead of returning PLACEHOLDER in the final column, I want it to show a MATCH or MISMATCH. Do I do some sort of a conditional join on the other table?
DESIRED RESULTS
EMPLID | ID | QTR | E.SUBJ | E.COURSE_NUM | R.SUBJ | R.COURSE_NUM | FOLLOW_PLAN
11111 | 1 | 2213 | HCML | 325 | HCML | 325 | MATCH
11111 | 1 | 2213 | HPM | 340 | NULL | NULL | MISMATCH
11111 | 1 | 2215 | CMST | 330 | NULL | NULL | MISMATCH
22222 | 1 | 2213 | ART | 110 | NULL | NULL | MISMATCH
22222 | 1 | 2213 | GENERAL | 1 | ENGL | 201 | MATCH
22222 | 1 | 2213 | GENERAL | 5 | ASTR& | 101 | MATCH
Here is a sample of the code I have working now:
CREATE TABLE PlanCourses ( EMPLID int ,ID int ,QTR int ,SUBJ varchar(7) ,COURSE_NUM int ); INSERT INTO PlanCourses VALUES (11111,1,2213,'HCML',325) ,(11111,1,2213,'HPM',340) ,(11111,1,2215,'CMST',330) ,(22222,1,2213,'ART',110) ,(22222,1,2213,'GENERAL',1) ,(22222,1,2213,'GENERAL',5); CREATE TABLE CourseWork( EMPLID int ,QTR int ,SUBJ varchar(7) ,COURSE_NUM int ); INSERT INTO CourseWork VALUES (11111,2213,'CMST',330) ,(11111,2213,'HCML',325) ,(11111,2215,'HPM',340) ,(22222,2213,'ART',110) ,(22222,2213,'ENGL',201) ,(22222,2213,'ASTR&',101); CREATE TABLE PlaceholderCourse ( SUBJ varchar(7) ,NUM int ,MAPPING int); INSERT INTO PlaceholderCourse VALUES ('ENGL&',101,1) ,('ENGL',201,1) ,('ENGL&',235,1) ,('ANTH&',215,5) ,('ASTR&',101,5) ,('BIOL',108,5); GO
18 rows affected
SELECT * FROM PlanCourses; SELECT * FROM CourseWork; SELECT * FROM PlaceholderCourse; GOEMPLID | ID | QTR | SUBJ | COURSE_NUM -----: | -: | ---: | :------ | ---------: 11111 | 1 | 2213 | HCML | 325 11111 | 1 | 2213 | HPM | 340 11111 | 1 | 2215 | CMST | 330 22222 | 1 | 2213 | ART | 110 22222 | 1 | 2213 | GENERAL | 1 22222 | 1 | 2213 | GENERAL | 5 EMPLID | QTR | SUBJ | COURSE_NUM -----: | ---: | :---- | ---------: 11111 | 2213 | CMST | 330 11111 | 2213 | HCML | 325 11111 | 2215 | HPM | 340 22222 | 2213 | ART | 110 22222 | 2213 | ENGL | 201 22222 | 2213 | ASTR& | 101 SUBJ | NUM | MAPPING :---- | --: | ------: ENGL& | 101 | 1 ENGL | 201 | 1 ENGL& | 235 | 1 ANTH& | 215 | 5 ASTR& | 101 | 5 BIOL | 108 | 5
SELECT E.EMPLID ,E.ID ,E.QTR ,E.SUBJ ,E.COURSE_NUM ,R.SUBJ ,R.COURSE_NUM ,CASE WHEN E.SUBJ = 'GENERAL' THEN 'PLACEHOLDER' WHEN R.SUBJ IS NOT NULL THEN 'Match' ELSE 'Mismatch' END AS FOLLOW_PLAN FROM PLANCOURSES E LEFT JOIN COURSEWORK R ON R.EMPLID = E.EMPLID AND R.QTR = E.QTR AND R.SUBJ = E.SUBJ AND R.COURSE_NUM = E.COURSE_NUM GOEMPLID | ID | QTR | SUBJ | COURSE_NUM | SUBJ | COURSE_NUM | FOLLOW_PLAN -----: | -: | ---: | :------ | ---------: | :--- | ---------: | :---------- 11111 | 1 | 2213 | HCML | 325 | HCML | 325 | Match 11111 | 1 | 2213 | HPM | 340 | null | null | Mismatch 11111 | 1 | 2215 | CMST | 330 | null | null | Mismatch 22222 | 1 | 2213 | ART | 110 | ART | 110 | Match 22222 | 1 | 2213 | GENERAL | 1 | null | null | PLACEHOLDER 22222 | 1 | 2213 | GENERAL | 5 | null | null | PLACEHOLDER
db<>fiddle here