xixi6_dorm_precheck.sql 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. -- 西溪6号楼住宿预检查脚本(根据 学校学生住宿情况@西溪6号楼.md 自动生成)
  2. -- 说明: 本脚本仅做预检查,不会对正式表进行增删改
  3. DROP TEMPORARY TABLE IF EXISTS tmp_assign_input_raw;
  4. CREATE TEMPORARY TABLE tmp_assign_input_raw (
  5. room_code VARCHAR(20) NOT NULL,
  6. bed_name VARCHAR(20) NOT NULL,
  7. student_name VARCHAR(50) NULL,
  8. class_name_raw VARCHAR(100) NULL,
  9. remark VARCHAR(200) NULL,
  10. source_line INT NULL,
  11. raw_text VARCHAR(255) NULL
  12. );
  13. INSERT INTO tmp_assign_input_raw(room_code, bed_name, student_name, class_name_raw, remark, source_line, raw_text)
  14. VALUES
  15. ('6302', '1上', '徐湘琴', '药剂211', NULL, 32, '1上 徐湘琴 药剂211'),
  16. ('6302', '1下', '王瑜洁', '药剂211', NULL, 33, '1下 王瑜洁 药剂211'),
  17. ('6302', '2上', '周慧颖', '药剂211', NULL, 34, '2上 周慧颖 药剂211'),
  18. ('6302', '2下', '鲁子奕', '药剂211', NULL, 35, '2下 鲁子奕 药剂211'),
  19. ('6303', '1上', NULL, NULL, NULL, 39, '1上'),
  20. ('6303', '1下', '王佳慧', '药剂211', NULL, 40, '1下 王佳慧 药剂211'),
  21. ('6303', '2上', '张雅婷', '药剂211', NULL, 41, '2上 张雅婷 药剂211'),
  22. ('6303', '2下', '章征浣', '药剂211', NULL, 42, '2下 章征浣 药剂211'),
  23. ('6304', '1上', '吕杭', '药剂211', NULL, 46, '1上 吕杭 药剂211'),
  24. ('6304', '1下', '沈晓冉', '药剂211', NULL, 47, '1下 沈晓冉 药剂211'),
  25. ('6304', '2上', '应雪燕', '药剂211', NULL, 48, '2上 应雪燕 药剂211'),
  26. ('6304', '2下', NULL, NULL, NULL, 49, '2下'),
  27. ('6305', '1上', '邱夕颜', '药剂232', NULL, 53, '1上 邱夕颜 药剂232'),
  28. ('6305', '1下', '郑飞杨', '药剂211', NULL, 54, '1下 郑飞杨 药剂211'),
  29. ('6305', '2上', '涂舒涵', '药剂211', NULL, 55, '2上 涂舒涵 药剂211'),
  30. ('6305', '2下', '张欣雅', '中药232', NULL, 56, '2下 张欣雅 中药232'),
  31. ('6306', '1上', '来思琴', '药剂211', NULL, 60, '1上 来思琴 药剂211'),
  32. ('6306', '1下', '祝丽倩', '药剂211', NULL, 61, '1下 祝丽倩 药剂211'),
  33. ('6306', '2上', '吴思辰', '药剂211', NULL, 62, '2上 吴思辰 药剂211'),
  34. ('6306', '2下', '姚冰荧', '药剂211', NULL, 63, '2下 姚冰荧 药剂211'),
  35. ('6307', '1上', '刘欢', '药剂211', NULL, 67, '1上 刘欢 药剂211'),
  36. ('6307', '1下', '代舒琴', '药剂211', NULL, 68, '1下 代舒琴 药剂211'),
  37. ('6307', '2上', '冉庆铃', '药剂211', NULL, 69, '2上 冉庆铃 药剂211'),
  38. ('6307', '2下', '金舒琪', '药剂211', NULL, 70, '2下 金舒琪 药剂211'),
  39. ('6309', '1上', '傅瑜菲', '药剂211', '升学', 74, '1上 傅瑜菲 药剂211 升学'),
  40. ('6309', '1下', '何苗苗', '机器人231', NULL, 75, '1下 何苗苗 机器人231'),
  41. ('6309', '2上', '何静', '机器人231', NULL, 76, '2上 何静 机器人231'),
  42. ('6309', '2下', '袁笑笑', '机器人231', NULL, 77, '2下 袁笑笑 机器人231'),
  43. ('6401', '1上', '四郎志玛', '烹饪221', NULL, 81, '1上 四郎志玛 烹饪221'),
  44. ('6401', '1下', '仁青拉姆', '烹饪221', NULL, 82, '1下 仁青拉姆 烹饪221'),
  45. ('6401', '2上', '多吉志玛', '烹饪221', NULL, 83, '2上 多吉志玛 烹饪221'),
  46. ('6401', '2下', NULL, NULL, NULL, 84, '2下'),
  47. ('6402', '1上', '倪诗余', '电商231', NULL, 88, '1上 倪诗余 电商231'),
  48. ('6402', '1下', '颜雨焓', '电商231', NULL, 89, '1下 颜雨焓 电商231'),
  49. ('6402', '2上', '龚艾雯', '电商231', NULL, 90, '2上 龚艾雯 电商231'),
  50. ('6402', '2下', '占佳琪', '电商231', NULL, 91, '2下 占佳琪 电商231'),
  51. ('6403', '1上', '任果果', '电商231', NULL, 95, '1上 任果果 电商231'),
  52. ('6403', '1下', '赖桦蓉', '电商231', NULL, 96, '1下 赖桦蓉 电商231'),
  53. ('6403', '2上', '顾晶晶', '电商231', NULL, 97, '2上 顾晶晶 电商231'),
  54. ('6403', '2下', '裘园园', '电商231', NULL, 98, '2下 裘园园 电商231'),
  55. ('6404', '1上', '张未茜', '电商231', NULL, 102, '1上 张未茜 电商231'),
  56. ('6404', '1下', '周美德', '电商231', NULL, 103, '1下 周美德 电商231'),
  57. ('6404', '2上', '孙喜悦', '电商231', NULL, 104, '2上 孙喜悦 电商231'),
  58. ('6404', '2下', '姜萌怡', '电商231', NULL, 105, '2下 姜萌怡 电商231'),
  59. ('6405', '1上', '张善媛', '电商231', NULL, 109, '1上 张善媛 电商231'),
  60. ('6405', '1下', '秦诗怡', '电商231', NULL, 110, '1下 秦诗怡 电商231'),
  61. ('6405', '2上', '沈张瑶', '电商231', NULL, 111, '2上 沈张瑶 电商231'),
  62. ('6405', '2下', '李玲', '电商231', NULL, 112, '2下 李玲 电商231'),
  63. ('6406', '1上', '项子婷', '电商231', NULL, 116, '1上 项子婷 电商231'),
  64. ('6406', '1下', '李静姝', '电商231', NULL, 117, '1下 李静姝 电商231'),
  65. ('6406', '2上', NULL, NULL, NULL, 118, '2上'),
  66. ('6406', '2下', '吴晓燕', '电商231', NULL, 119, '2下 吴晓燕 电商231'),
  67. ('6407', '1上', '邱夕颜', '药剂232', NULL, 123, '1上 邱夕颜 药剂232'),
  68. ('6407', '1下', '张欣雅', '中药232', NULL, 124, '1下 张欣雅 中药232'),
  69. ('6407', '2上', '郑佳妮', '中药251', NULL, 125, '2上 郑佳妮 中药251'),
  70. ('6407', '2下', '张雅琴', '西餐运营232', NULL, 126, '2下 张雅琴 西餐运营232')
  71. ;
  72. DROP TEMPORARY TABLE IF EXISTS tmp_assign_norm;
  73. CREATE TEMPORARY TABLE tmp_assign_norm AS
  74. SELECT
  75. TRIM(room_code) AS room_code,
  76. TRIM(bed_name) AS bed_name,
  77. NULLIF(TRIM(student_name), '') AS student_name,
  78. CASE NULLIF(TRIM(SUBSTRING_INDEX(COALESCE(class_name_raw, ''), ' ', 1)), '')
  79. WHEN '数媒251' THEN '数字媒体251'
  80. WHEN '电商251' THEN '电子商务251'
  81. WHEN '电商252' THEN '电子商务252'
  82. WHEN '西餐运营211' THEN '西餐211'
  83. ELSE NULLIF(TRIM(SUBSTRING_INDEX(COALESCE(class_name_raw, ''), ' ', 1)), '')
  84. END AS class_name,
  85. NULLIF(TRIM(class_name_raw), '') AS class_name_raw,
  86. NULLIF(TRIM(remark), '') AS remark,
  87. source_line,
  88. raw_text
  89. FROM tmp_assign_input_raw;
  90. -- 1) 学生存在性检查(按姓名)
  91. DROP TEMPORARY TABLE IF EXISTS tmp_student_precheck;
  92. CREATE TEMPORARY TABLE tmp_student_precheck AS
  93. SELECT
  94. t.room_code,
  95. t.bed_name,
  96. t.student_name,
  97. COUNT(s.id) AS student_match_count,
  98. GROUP_CONCAT(DISTINCT s.class_name ORDER BY s.class_name SEPARATOR ', ') AS db_class_names,
  99. GROUP_CONCAT(DISTINCT s.id ORDER BY s.id) AS student_ids,
  100. t.source_line,
  101. t.raw_text
  102. FROM tmp_assign_norm t
  103. LEFT JOIN xg_student_msg s
  104. ON s.deleted = 0
  105. AND s.name COLLATE utf8mb4_general_ci = t.student_name COLLATE utf8mb4_general_ci
  106. WHERE t.student_name IS NOT NULL
  107. GROUP BY t.room_code, t.bed_name, t.student_name, t.source_line, t.raw_text;
  108. -- 2) 班级存在性检查(按班级名)
  109. DROP TEMPORARY TABLE IF EXISTS tmp_class_precheck;
  110. CREATE TEMPORARY TABLE tmp_class_precheck AS
  111. SELECT
  112. t.class_name,
  113. COUNT(c.id) AS class_match_count,
  114. GROUP_CONCAT(DISTINCT c.id ORDER BY c.id) AS class_ids
  115. FROM (SELECT DISTINCT class_name FROM tmp_assign_norm WHERE class_name IS NOT NULL) t
  116. LEFT JOIN xg_class_msg c
  117. ON c.deleted = 0
  118. AND c.class_name COLLATE utf8mb4_general_ci = t.class_name COLLATE utf8mb4_general_ci
  119. GROUP BY t.class_name;
  120. -- 3) 学生-班级匹配检查(学生存在,但不在输入班级)
  121. DROP TEMPORARY TABLE IF EXISTS tmp_student_class_precheck;
  122. CREATE TEMPORARY TABLE tmp_student_class_precheck AS
  123. SELECT
  124. t.room_code,
  125. t.bed_name,
  126. t.student_name,
  127. t.class_name AS input_class_name,
  128. COUNT(s_any.id) AS name_match_count,
  129. COUNT(s_exact.id) AS exact_match_count,
  130. GROUP_CONCAT(DISTINCT s_any.class_name ORDER BY s_any.class_name SEPARATOR ', ') AS db_class_names,
  131. t.source_line,
  132. t.raw_text
  133. FROM tmp_assign_norm t
  134. LEFT JOIN xg_student_msg s_any
  135. ON s_any.deleted = 0
  136. AND s_any.name COLLATE utf8mb4_general_ci = t.student_name COLLATE utf8mb4_general_ci
  137. LEFT JOIN xg_student_msg s_exact
  138. ON s_exact.deleted = 0
  139. AND s_exact.name COLLATE utf8mb4_general_ci = t.student_name COLLATE utf8mb4_general_ci
  140. AND s_exact.class_name COLLATE utf8mb4_general_ci = t.class_name COLLATE utf8mb4_general_ci
  141. WHERE t.student_name IS NOT NULL
  142. AND t.class_name IS NOT NULL
  143. GROUP BY t.room_code, t.bed_name, t.student_name, t.class_name, t.source_line, t.raw_text;
  144. -- 4) 统计总览:三类问题数量
  145. SELECT
  146. (SELECT COUNT(*) FROM tmp_student_precheck WHERE student_match_count = 0) AS student_not_found_cnt,
  147. (SELECT COUNT(*) FROM tmp_class_precheck WHERE class_match_count = 0) AS class_not_found_cnt,
  148. (SELECT COUNT(*) FROM tmp_student_class_precheck WHERE name_match_count > 0 AND exact_match_count = 0) AS student_class_mismatch_cnt;
  149. -- 5) 学生不存在明细
  150. SELECT
  151. room_code,
  152. bed_name,
  153. student_name,
  154. source_line,
  155. raw_text
  156. FROM tmp_student_precheck
  157. WHERE student_match_count = 0
  158. ORDER BY room_code, bed_name;
  159. -- 6) 班级不存在明细
  160. SELECT
  161. class_name
  162. FROM tmp_class_precheck
  163. WHERE class_match_count = 0
  164. ORDER BY class_name;
  165. -- 7) 学生和班级不匹配明细
  166. SELECT
  167. room_code,
  168. bed_name,
  169. student_name,
  170. input_class_name,
  171. db_class_names,
  172. source_line,
  173. raw_text
  174. FROM tmp_student_class_precheck
  175. WHERE name_match_count > 0
  176. AND exact_match_count = 0
  177. ORDER BY room_code, bed_name, student_name;