#sql-server #case #temp-tables
Вопрос:
Мне нужно иметь возможность отобрать тех студентов, которые в настоящее время зачислены, а затем определить более мелкие термины, статус и ярлык на основе первой категории, в которую они попадают. Категория — Спортсмен,Двойной зачет,Изобразительное искусство,Медицинские профессии,CTE,Кампус 1,Кампус 2,Кампус 3,Онлайн,Кампус 4,Без задания
Большая часть необходимой мне информации содержится в нескольких таблицах, и первичные ключи помечены по-разному во всех таблицах. Я создал три временные таблицы, одну для студентов, а две другие для оставшейся информации. Затем я объединил все три таблицы, и у меня есть операторы case, чтобы просмотреть вложенный термин и иерархию группировок, которые мы хотим использовать.
Запрос может вытащить все, и операторы case работают, проблема в том, что их записи дублируются, когда они попадают в более чем одну категорию. Я попытался поместить операторы case в соответствующую временную таблицу, а затем в окончательный запрос, в котором объединены все три таблицы, но ничего не сработало.
Первоначально я использовал Tableau и мог делать все, но та же проблема возникла при просмотре одного или нескольких терминов, подсчеты дублировались, когда студенты были в более чем одной категории.
Бывший студент посещает 16 — недельные занятия и два 8-недельных занятия. Она изучает изобразительное искусство, и в программе CTE она попадет в категорию изобразительного искусства и будет иметь это звание для каждого из дополнительных терминов.
Пример 1 —> Отдельный идентификатор 21/SP CTE
Пример 2 —> Отдельный идентификатор 21/SP Онлайн
Это последний запрос, используемый в конце, он объединяет три таблицы в таблице #РЕГИСТРАЦИЯ, где исходная временная таблица используется для запроса нужных нам студентов и получения отдельного списка.
SELECT DISTINCT E.STUDENT_ID AS "S_ID",
--#PROG.PROGRAM,
#SPECIAL.[NEW/RETURNER],
CASE
WHEN ENROLL_START_DATE = '01/19/2021' AND E.ENROLL_END_DATE = '05/11/2021' THEN '21/SP 16W'
WHEN [ENROLL_START_DATE] = '01/19/2021' AND ENROLL_END_DATE = '03/17/2021' THEN '21/SP 8W1'
WHEN [ENROLL_START_DATE] = '03/22/2021' AND ENROLL_END_DATE = '05/11/2021' THEN '21/SP 8W2'
WHEN [ENROLL_START_DATE] = '05/17/2021' AND ENROLL_END_DATE = '06/03/2021' THEN '21/SP MM'
WHEN [ENROLL_START_DATE] = '06/07/2021' AND ENROLL_END_DATE = '07/12/2021' THEN '21/S1 6W1'
WHEN [ENROLL_START_DATE] = '06/07/2021' AND ENROLL_END_DATE = '08/16/2021' THEN '21/S1 12W'
WHEN [ENROLL_START_DATE] = '07/13/2021' AND ENROLL_END_DATE = '08/16/2021' THEN '21/S2 6W2'
WHEN [ENROLL_START_DATE] = '08/23/2021' AND ENROLL_END_DATE = '12/11/2021' THEN '21/FA 16W'
WHEN [ENROLL_START_DATE] = '08/23/2021' AND ENROLL_END_DATE= '10/13/2021' THEN '21/FA 8W1'
WHEN [ENROLL_START_DATE] = '10/18/2021' AND ENROLL_END_DATE = '12/11/2021' THEN '21/FA 8W2'
--ELSE ' '
END AS [SUB TERM],
CASE
WHEN #SPECIAL.GROUPING = 'ATHLETE' THEN 'ATHLETE'
WHEN DC.DC_RESTRICTION = 'CCHS' THEN 'DC'
WHEN #SPECIAL.GROUPING = 'FA' THEN 'FA'
WHEN #PROG.PROGRAM = 'HP' THEN 'HP'
WHEN #PROG.PROGRAM = 'CTE' THEN 'CTE'
WHEN #SPECIAL.GROUPING = 'MEX' THEN 'MEXIA CAMPUS'
WHEN #SPECIAL.GROUPING = 'WAX' THEN 'WAXAHACHIE CAMPUS'
WHEN #SPECIAL.GROUPING = 'MID' THEN 'MIDLOTHIAN CAMPUS'
WHEN #SPECIAL.GROUPING = 'ITN' THEN 'ONLINE'
WHEN #SPECIAL.GROUPING = 'CC' THEN 'CORSICANA CAMPUS'
ELSE ' '
END AS 'NEW GROUP'
FROM #ENROLL E
LEFT JOIN #SPECIAL ON #SPECIAL.N05_STTR_STUDENT = E.STUDENT_ID
LEFT JOIN #PROG ON #PROG.N05_PRGM_STUDENT = E.STUDENT_ID
LEFT JOIN [coll18_prod].[dbo].N05_DUAL_CREDIT DC ON DC_ID = E.STUDENT_ID
ORDER BY S_ID
Обновить:
Я создал рейтинг для каждой категории за семестр.
IF OBJECT_ID('tempdb..#RANK') is not null
DROP TABLE #RANK
SELECT *,
CASE
WHEN #ENROLL_1.[NEW GROUP] LIKE 'ATHLETE' THEN 1
WHEN #ENROLL_1.[NEW GROUP] LIKE 'DC' THEN 2
WHEN #ENROLL_1.[NEW GROUP] LIKE 'FA' THEN 3
WHEN #ENROLL_1.[NEW GROUP] LIKE 'HP' THEN 4
WHEN #ENROLL_1.[NEW GROUP] LIKE 'CTE' THEN 5
WHEN #ENROLL_1.[NEW GROUP] LIKE 'MEXIA CAMPUS' THEN 6
WHEN #ENROLL_1.[NEW GROUP] LIKE 'WAXAHACHIE CAMPUS' THEN 7
WHEN #ENROLL_1.[NEW GROUP] LIKE 'MIDLOTHIAN CAMPUS' THEN 8
WHEN #ENROLL_1.[NEW GROUP] LIKE 'ONLINE' THEN 9
WHEN #ENROLL_1.[NEW GROUP] LIKE 'CORSICANA CAMPUS' THEN 10
WHEN #ENROLL_1.[NEW GROUP] LIKE ' ' THEN 11
ELSE ' '
END AS [RANK],
CASE
WHEN #ENROLL_1.[SUB TERM] LIKE '21/SP 16W' THEN '21/SP 16W'
WHEN #ENROLL_1.[SUB TERM] LIKE '21/SP 8W1' THEN '21/SP 8W1'
WHEN #ENROLL_1.[SUB TERM] LIKE '21/SP 8W2' THEN '21/SP 8W2'
WHEN #ENROLL_1.[SUB TERM] LIKE '21/SP MM' THEN '21/SP MM'
WHEN #ENROLL_1.[SUB TERM] LIKE '21/S1 6W1' THEN '21/S1 6W1'
WHEN #ENROLL_1.[SUB TERM] LIKE '21/S1 12W' THEN '21/S1 12W'
WHEN #ENROLL_1.[SUB TERM] LIKE '21/S2 6W2' THEN '21/S2 6W2'
WHEN #ENROLL_1.[SUB TERM] LIKE '21/FA 16W' THEN '21/FA 16W'
WHEN #ENROLL_1.[SUB TERM] LIKE '21/FA 8W1' THEN '21/FA 8W1'
WHEN #ENROLL_1.[SUB TERM] LIKE '21/FA 8W2' THEN '21/FA 8W2'
ELSE ' '
END AS [S_TERM]
INTO #RANK
FROM #ENROLL_1
SELECT DISTINCT #RANK.S_ID,#RANK.[NEW/RETURNER],#RANK.S_TERM,#RANK.[NEW GROUP],MIN(#RANK.[RANK]) FROM #RANK
WHERE #RANK.S_ID = '0011339'
AND #RANK.[NEW GROUP] <> ' '
GROUP BY #RANK.S_ID,#RANK.[NEW/RETURNER],#RANK.S_TERM,#RANK.[NEW GROUP],#RANK.[RANK]
ORDER BY S_ID
Результаты близки, но он извлекает несколько значений. Пример приведен на картинке
введите описание изображения здесь
Комментарии:
1. Если проблема в том, что учащиеся попадают в несколько категорий, вам необходимо определить, какая категория имеет приоритет, чтобы возвращать только эту строку.
2. Это звучит идеально, как/когда мне это сделать? Является ли это конкретной функцией для достижения этой цели? Тогда единственный способ, о котором я не могу думать, — это создать ВСТАВКУ из ПРЕДСТАВЛЕНИЯ СОЗДАНИЯ, с которым я работаю
3. Я не смогу вам этого сказать, только вы знаете свои данные. Но мне интересно, не неправильно ли вы понимаете принцип того, что делает ряд уникальным. При взгляде на второе изображение у вас есть строки для одного и того же идентификатора (0011339), но другие столбцы предоставляют более подробную информацию о том, чтобы каждая строка была уникальной. Таким образом, у вас есть несколько строк с ВОЗВРАЩАЕМЫМ и НОВЫМ, но в следующем столбце есть такие значения, как 21/SP 16W и 21/S1 6W1. Эти разные значения, несмотря на то, что другие значения одинаковы, делают эти строки разными, поэтому они оба отображаются как «дубликаты».