SQL脚本问题 - 复制

时间:2017-10-27 17:45:05

标签: sql sql-server tsql

我有一个SQL脚本,用于从数据库中的多个表中提取数据。原则上这是有效的,但我希望添加以下行为: 情景时根据3种可能的选项检查课程标题的情况。如果它出现在标题中,则它检查另一个数据库并找到具有特定AssessorType的TOP 1 AssessorID(按DESC结束日期排序)。这种类型的想法是这种类型的评估者。如果它不存在于3个可能的选项中,它应该只针对该路线拉出评估者类型A.通常可以有4个课程,1个学习者3可以是评估员类型E或F,1个是A类。

该脚本生成结果但是会发生的事情是它为每个相关课程创建了一个重复的行

学习者A - 课程A - 评估员类型A

学员A - 课程B - 评估员类型E

我希望实现的是1门课程的1行,但根据具体情况,该课程的正确单一评估类型。

以下是正在运行的完整脚本

SELECT DISTINCT 
                  TOP (100) PERCENT TRAINEE.LLWR_LEARN_ID AS MISLearnerID, 
                  REPLACE(TRAINEE.FIRSTNAME, ' ', '.')+REPLACE(TRAINEE.LASTNAME,' ','') AS UserID, 
                  TRAINEE.FIRSTNAME AS Forename, 
                  TRAINEE.LASTNAME AS Surname, 
                  TRAINEE.ADDRESS1 AS HomeAddressLine1, 
                  TRAINEE.LLWR_LEARN_ID AS StudentID, 
                  TRAINEE.ADDRESS2 AS HomeAddressLocality, 
                  TRAINEE.POSTTOWN AS HomeAddressTown, 
                  TRAINEE.COUNTY AS HomeAddressCounty, 
                  TRAINEE.UNIQUELEARNERNUMBER AS ULN, 
                  TRAINEE.POSTCODE AS HomeAddressPostCode, 
                  TRAINEEPOT2.LLWR_DISABLE2 AS LDisability,

                  CASE WHEN TRAINEEPOT2.LLWR_NUM_STRT = '1' THEN 'Entry Level 1' 
                  WHEN TRAINEEPOT2.LLWR_NUM_STRT = '1' THEN 'Entry Level 1' 
                  WHEN TRAINEEPOT2.LLWR_NUM_STRT = '2' THEN 'Entry Level 2' 
                  WHEN TRAINEEPOT2.LLWR_NUM_STRT = '3' THEN 'Entry Level 3' 
                  WHEN TRAINEEPOT2.LLWR_NUM_STRT = '5' THEN 'Level 1' 
                  WHEN TRAINEEPOT2.LLWR_NUM_STRT = 'D' THEN 'Level 2'
                  WHEN TRAINEEPOT2.LLWR_NUM_STRT = 'F' THEN 'Level 3' 
                  END AS InitialAssessmentNumeracy, 

                  CASE WHEN TRAINEEPOT2.LLWR_LITY_SRT = '1' THEN 'Entry Level 1' 
                  WHEN TRAINEEPOT2.LLWR_LITY_SRT = '2' THEN 'Entry Level 2' 
                  WHEN TRAINEEPOT2.LLWR_LITY_SRT = '3' THEN 'Entry Level 3' 
                  WHEN TRAINEEPOT2.LLWR_LITY_SRT = '5' THEN 'Level 1' 
                  WHEN TRAINEEPOT2.LLWR_LITY_SRT = 'D' THEN 'Level 2' 
                  WHEN TRAINEEPOT2.LLWR_LITY_SRT = 'F' THEN 'Level 3' 
                  END AS InitialAssessmentLiteracy, 

                  CASE WHEN TRAINEEINFO.U_DIGLIT = 'E1' THEN 'Entry Level 1' 
                  WHEN TRAINEEINFO.U_DIGLIT = 'E2' THEN 'Entry Level 2' 
                  WHEN TRAINEEINFO.U_DIGLIT = 'E3' THEN 'Entry Level 3' 
                  WHEN TRAINEEINFO.U_DIGLIT = 'L1' THEN 'Level 1' 
                  WHEN TRAINEEINFO.U_DIGLIT = 'L2' THEN 'Level 2' 
                  WHEN TRAINEEINFO.U_DIGLIT = 'L3' THEN 'Level 3' 
                  WHEN TRAINEEINFO.U_DIGLIT = 'na' THEN 'Not Applicable' 
                  END AS InitialAssessmentICT,

                  TRAINEE.EMAIL, TRAINEE.TELEPHONE AS TelNum, 
                  TRAINEE.DOB, 
                  TRAINEE.NINUMBER AS NationalInsuranceNo,
                      (SELECT     TOP (1) LONGSTRING
                        FROM          LOOKUP
                        WHERE      
                        (TABLENAME = 'TRAINEE') AND (FIELDNAME = 'GENDER') AND (SHORTSTRING = TRAINEE.GENDER)) AS Sex, 
                        TRAINEE.MOBILE, 
                  TREMPLOYER.EMPLOYERID AS MISEmployerID, 
                  TRAINEE_LLWR_ACT.LAIM_REF AS [Courses/Course/LadCode], 
                  TRAINEE_LLWR_ACT.TITLE_LA AS [Courses/Course/CourseName], 
                  TRAINEE_LLWR_ACT.EENDDATE AS [Courses/Course/CourseEndDate], 
                  TRAINEEPOT.STARTDATE AS [Courses/Course/CourseStartDate], 
                  TRAINEE_LLWR_ACT.TERMDATE AS [Courses/Course/ActualEndDate], TRAINEE_LLWR_ACT.REGNUMBER AS [Courses/Course/RegistrationNumber],

                  CASE WHEN TRAINEE_LLWR_ACT.TITLE_LA IN ('%CG COMM%','%CG AON%','%CG DIG LIT%') THEN

                    (SELECT TOP (1) TRASSESSOR.ASSESSORID
                        FROM TRAINEE INNER JOIN
                            TRASSESSOR ON TRAINEE.TRAINEEID = TRASSESSOR.TRAINEEID
                        WHERE (TRASSESSOR.ASSESSORTYPE = 'E' OR TRASSESSOR.ASSESSORTYPE = 'F') AND (TRASSESSOR.TRAINEEID = TRAINEE.TRAINEEID)
                        ORDER BY TRASSESSOR.ENDDATE DESC)
                        ELSE TRASSESSOR.ASSESSORID END AS [Courses/Course/MISAssessorID],

                  CASE WHEN TRAINEE_LLWR_ACT.COMPSTAT = 1 THEN 'IT' 
                  WHEN TRAINEE_LLWR_ACT.COMPSTAT = 2 THEN 'CM' 
                  WHEN TRAINEE_LLWR_ACT.COMPSTAT = 3 THEN 'EL' 
                  WHEN TRAINEE_LLWR_ACT.COMPSTAT = 4 THEN 'TR' 
                  WHEN TRAINEE_LLWR_ACT.COMPSTAT = 5 THEN 'TS' 
                  WHEN TRAINEE_LLWR_ACT.COMPSTAT = 6 THEN 'EL' END AS [Courses/Course/Status]

FROM         TRAINEE INNER JOIN
                  TREMPLOYER ON TRAINEE.TRAINEEID = TREMPLOYER.TRAINEEID INNER JOIN
                  TRAINEE_LLWR_ACT ON TRAINEE.TRAINEEID = TRAINEE_LLWR_ACT.TRAINEEID INNER JOIN
                  TRASSESSOR ON TRAINEE.TRAINEEID = TRASSESSOR.TRAINEEID INNER JOIN
                  TRAINEEINFO ON TRAINEE.TRAINEEID = TRAINEEINFO.TRAINEEID INNER JOIN
                  TRAINEEPOT ON TRAINEE.TRAINEEID = TRAINEEPOT.TRAINEEID INNER JOIN
                  TRAINEEPOT2 ON TRAINEE.TRAINEEID = TRAINEEPOT2.TRAINEEID 

WHERE     (TRAINEEINFO.U_E_PORTFOLIO = 'Yes') AND (TRAINEE.ADMINCENTREID = '0003') AND 
                  (TRAINEE_LLWR_ACT.DELIVERY = '09' OR
                  TRAINEE_LLWR_ACT.DELIVERY = '03' OR
                  TRAINEE_LLWR_ACT.DELIVERY = '02') AND (TRASSESSOR.ENDDATE =
                      (SELECT     MAX(ENDDATE) AS Expr1
                        FROM          TRASSESSOR AS TRASSESSOR_1
                        WHERE      (TRAINEE.TRAINEEID = TRAINEEID))) AND
                      ((SELECT     TOP (1) EMPLOYERID
                          FROM         TREMPLOYER AS TREMPLOYER_1
                          WHERE     (TRAINEEID = TRAINEE.TRAINEEID)
                          ORDER BY STARTDATE DESC) = TREMPLOYER.EMPLOYERID) 
ORDER BY surname

这里讨论的具体案例是:

CASE WHEN TRAINEE_LLWR_ACT.TITLE_LA IN ('%CG COMM%','%CG AON%','%CG DIG LIT%') THEN

                    (SELECT TOP (1) TRASSESSOR.ASSESSORID
                        FROM TRAINEE INNER JOIN
                            TRASSESSOR ON TRAINEE.TRAINEEID = TRASSESSOR.TRAINEEID
                        WHERE (TRASSESSOR.ASSESSORTYPE = 'E' OR TRASSESSOR.ASSESSORTYPE = 'F') AND (TRASSESSOR.TRAINEEID = TRAINEE.TRAINEEID)
                        ORDER BY TRASSESSOR.ENDDATE DESC)
                        ELSE TRASSESSOR.ASSESSORID END AS [Courses/Course/MISAssessorID]

我确定它可能与JOINS有关,但我对SQL不够合格,无法理解我需要做什么。任何帮助表示赞赏!!

1 个答案:

答案 0 :(得分:0)

找出问题并解决为Case When和select设置错误。代码基本上从不运行select脚本来查询正确的评估者