2013-06-21 69 views
0

我有一個存儲過程,它需要1個參數,一個ID號(systudentid)。在數據中合併多行以在結果中僅顯示單行

該程序返回3行:學生的學術顧問(AC),財務顧問(FC)和招生顧問(EC)以及相關的聯繫信息; 3個不同的人。

某些學生的AC和FC是同一個人,但查詢仍然會返回3行。

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

AC   DOE    JOHN    .....  12345 

AC   DOE    JOHN    .....  12345 

EC   SMITH   JANE    .....  45678 

凡在我的代碼,我可以插上邏輯(以及如何,我用SQL新手),這樣,當傳遞給過程的systudentid識別具有同一個人AC和FC學生,它將以這種方式顯示結果。

顧問類型更改爲「SSA」,並且只返回雙職顧問的其中一個記錄。

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

SSA   DOE    JOHN    ......  12345 

EC   SMITH   JANE    ......  45678 

這裏是我的select語句:

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 

這可能有一兩個錯誤,因爲您沒有包含表模式。嵌套子查詢「倍數」包含顧問在多個組中的所有顧問/參與者對。如果在嵌套子查詢中存在匹配的條目,則可以將這個選擇留給「SSA」。

一個重要的注意事項:如書面所示,這將包含兩個SSA行,用於符合條件的顧問/參與者對。但是,最終結果不會,因爲您在此查詢中使用了UNION,即使它們僅存在於聯合的一半中,也會過濾掉重複項。如果將其更改爲UNION ALL或完全消除UNION,則需要將DISTINCT添加到查詢的頂部,如下所示:

SELECT DISTINCT CASE WHEN (mutiples.SyStaffID IS NOT NULL) ...