SQL-запрос с использованием временных таблиц дублирует результаты для каждого используемого оператора case

#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. Эти разные значения, несмотря на то, что другие значения одинаковы, делают эти строки разными, поэтому они оба отображаются как «дубликаты».