微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用临时表的 SQL 查询会为所使用的每个 case 语句复制结果

如何解决使用临时表的 SQL 查询会为所使用的每个 case 语句复制结果

我需要能够提取当前注册的学生,然后根据他们所属的第一个类别定义更小的子术语、状态和标签。类别-运动员,双学分,美术,健康专业,CTE,校园1,校园2,校园3,在线,校园4,无作业

我需要的大部分信息都在几个表中,并且主键在所有表中的标记都不同。我创建了三个临时表,一个用于学生,另外两个用于其余信息。然后我加入了所有三个表并使用 case 语句来查看我们想要使用的子术语和分组层次结构。

查询能够提取所有内容并且 case 语句起作用,问题是当它们属于多个类别时,它们的记录会重复。我尝试将 case 语句放在相关的临时表中,然后在所有三个表都连接但没有任何效果的最终查询中。

最初我使用 Tableau 并且能够做所有事情,但在查看一个或多个术语时出现了同样的问题,当学生属于多个类别时,计数会重复。

前学生正在参加一个 16 周的课程和两个 8 周的课程。她是一名美术学生,在 CTE 计划中,她将属于美术类别,并且每个子术语都有该标题

Example 1 --> 独特的 ID 21/SP CTE

Example 2 --> 独特的 ID 21/SP 在线

这是最后使用的最终查询,它将三个表连接到#ENROLL 表上,其中原始临时表用于查询我们需要的学生并得到一个不同的列表。

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.[RANK]
ORDER BY S_ID

结果很接近,但它提取了多个值。例子在图片enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。