2013-06-21 2 views
0

ID 번호 (systudentid)가 1 개인 매개 변수를 사용하는 저장 프로 시저가 있습니다.데이터에 여러 행을 병합하여 결과에 단일 행만 표시합니다.

이 절차는 관련 연락처 정보와 함께 학생 행지도 교수 (AC), 재정 상담사 (FC) 및 입학 상담원 (EC)의 3 행을 반환합니다. 3 명의 다른 사람들.

일부 학생에게는 같은 사람인 AC와 FC가 있지만 질문은 여전히 ​​3 행을 반환합니다. 내 코드에서 나는 논리를 연결 (어떻게, 내가 SQL에 대한 초보자이야) 그래서 할 수

AdvisorType|AdvisorLastName|AdvisorFirstName|(other data)|systaffID 

AC   DOE    JOHN    .....  12345 

AC   DOE    JOHN    .....  12345 

EC   SMITH   JANE    .....  45678 

절차에 전달 된 systudentid는 AC와 FC 모두 같은 사람을 가진 학생을 식별 할 때 , 결과를 이렇게 표시합니다.

권고 자 유형이 "SSA"로 변경되고 이중 의무 상담원에 대한 레코드 중 하나만 리턴됩니다. 여기

AdvisorType|AdvisorLastName|AdvisorFirstName|(other data)|SystaffID 

SSA   DOE    JOHN    ......  12345 

EC   SMITH   JANE    ......  45678 

내 선택 성명 : 내가 시도 할 수 있습니다 또는 Google (I 검색 해봤지만 내가 무엇을 알았다면 결과는 훨씬 더 유용

SELECT 
     SyStaffGroup.Descrip AS AdvisorType 
     ,SyStaff.LastName AS AdvisorLastName 
     ,SyStaff.FirstName  AS AdvisorFirstName 
     ,SyStaff.Phone   AS AdvisorPhone 
     ,SyStaff.Ext   AS AdvisorExtention 
     ,SyStaff.eMail   AS AdvisorEMail 
     ,SyStaff.SyStaffID  AS SyStaffID 

    FROM SyStaff (NOLOCK) 
    JOIN SyAdvisorByEnroll (NOLOCK) 
     ON SyAdvisorByEnroll.SyStaffID = SyStaff.SyStaffID 
    JOIN SyStaffGroup (NOLOCK) 
     ON SyStaffGroup.SyStaffGroupID = SyAdvisorByEnroll.SyStaffGroupID 
    JOIN AdEnroll (NOLOCK) 
     ON AdEnroll.AdEnrollID = SyAdvisorByEnroll.AdEnrollID 
    JOIN SyStudent (NOLOCK) 
     ON AdEnroll.SyStudentID = SyStudent.SyStudentId 

    WHERE 
     SyStaff.Active = 1 

     --AND 
     --syadvisorbyenroll.adenrollid = (
     --SELECT adenrollid from dbo.fn_student_enrollment_activeenrollmentlist (@systudentid) 
     --) 

     AND adEnroll.adEnrollID IN (
       SELECT adEnrollID FROM dbo.fn_Student_Enrollment_ActiveEnrollmentList(@SyStudentID)  
     ) 
    AND SyAdvisorByEnroll.AdvisorModule IN ('AD','FA') 
    AND SyStaffGroup.Descrip IN ('AC - Academic Counselor', 'FC - Finance Counselors', 'EC - Adm. Counselor With Reg') 

UNION 

SELECT DISTINCT 
     'Admissions Counselor' AS AdvisorType 
      ,SyStaff.LastName AS AdvisorLastName 
      ,SyStaff.FirstName  AS AdvisorFirstName 
      ,SyStaff.Phone   AS AdvisorPhone 
      ,SyStaff.Ext   AS AdvisorExtention 
      ,SyStaff.eMail   AS AdvisorEMail 
      ,SyStaff.SyStaffID  AS SyStaffID 
FROM systudent 
     INNER JOIN AmRep ON SyStudent.AMREpID = AmREp.AMREpid 
     INNER JOIN SyStaff ON SyStaff.SyStaffID = AmRep.AmRepID 
WHERE Systudent.SYStudentid = @systudentid 

어떤 힌트 또는 제안 된 방법 찾는) 크게 감사하겠습니다.

답변

0

중첩 된 부속 조회를 추가하여 동일한 권고자가 여러 위치를 채우는 학생을 표시하고 이에 따라 유형 선택을 조정할 수 있습니다. 당신이 당신의 테이블 스키마를 포함하지 않았기 때문에

SELECT 
    CASE WHEN (mutiples.SyStaffID IS NOT NULL) THEN 'SSA' 
    ELSE SyStaffGroup.Descrip END AS AdvisorType 
    -- other columns omitted 
FROM SyStaff (NOLOCK) 
JOIN SyAdvisorByEnroll (NOLOCK) 
    ON SyAdvisorByEnroll.SyStaffID = SyStaff.SyStaffID 
LEFT JOIN (
    SELECT SyStaffID,AdEnrollID 
    FROM SyAdvisorByEnroll 
    GROUP BY SyStaffID,AdEnrollID 
    HAVING COUNT(DISTINCT SyStaffGroupID) > 1 
) multiples 
    ON multiples.SyStaffID = SyAdvisorByEnroll.SyStaffID 
    AND multiples.AdEnrollID = SyAdvisorByEnroll.AdEnrollID 
-- rest of query omitted 

이것은 실수 또는 두 가지가있을 수 있습니다 : 다음은 위의 쿼리의 변경된 부분입니다. 중첩 된 하위 쿼리 "multiples"는 고문이 여러 그룹에있는 모든 advisor/enrollee 쌍을 포함합니다. 중첩 된 하위 쿼리에 일치하는 항목이 있으면이 유형에 대한 조인을 취소하고 최종 유형 선택을 "SSA"로 조정합니다.

중요한주의 사항 : 작성된대로 자격이있는 권고 자/등록자 쌍에 대해 두 개의 SSA 행이 포함됩니다. 그러나 UNION을이 쿼리에서 사용하기 때문에 최종 결과가 나오지 않을 것입니다. UNION은 유니온의 절반에만 존재한다고해도 중복 된 것을 필터링합니다. 이것을 UNION ALL으로 변경하거나 UNION을 완전히 제거하면 다음과 같이 DISTINCT를 쿼리의 맨 위에 추가해야합니다.

SELECT DISTINCT CASE WHEN (mutiples.SyStaffID IS NOT NULL) ... 
관련 문제