2012-08-29 59 views
1

我需要查詢學生(STU)&程序(PGM)表和每ID返回一個聯合的紀錄,即使有多個PGM記錄每ID。我想過使用GROUP BY STU.ID, STU.FN, STU.LN,但當時我不知道如何在SELECT使用PGM.CD,因爲它不是由clause.`SQL Server 2008中 - 選擇(每個ID)的多個記錄合併到一個記錄

PGM表可能有也可能沒有記錄的聚合函數或GROUP。我下面的查詢返回這些可能的結果:

  1. 如果沒有PGM記錄,每ID只有一個結果被返回和 的PGM.CD列返回NULL(佔CASE'')。
  2. 如果只有一個在PGM表記錄,並PGM.CD = 200'DLA'CASE),然後每ID只有一個結果返回。
  3. 如果只有一個在PGM表記錄,並PGM.CD <> 200''CASE),然後每ID只有一個結果返回。
  4. 如果在PGM表多於一個的記錄(每ID),即 121,200,156,這每ID產生多個行。

我需要一個查詢,每ID只返回一行,結合PGM.CD列的結果。該PGM.CD欄應該只返回''200'DLA'CASE

SELECT STU.ID, STU.FN, STU.LN, 
    CASE PGM.CD 
    WHEN '200' THEN 'DLA' 
    ELSE '' 
    END 
FROM STU 
LEFT JOIN PGM 
    ON STU.ID = PGM.PID 

這是我的查詢將返回(沒有CASE修改PGM.CD):

STU.ID STU.FN STU.LN PGM.CD 
1000 Bruce Wayne NULL 
1001 Clark Kent 200 
1002 Barry Allen 151 
1002 Barry Allen 101 
1003 Hal  Jordan 126 
1003 Hal  Jordan 200 
1003 Hal  Jordan 101 

這是我的查詢退貨(WithCASE修改PGM.CD):

STU.ID STU.FN STU.LN PGM.CD 
1000 Bruce Wayne 
1001 Clark Kent DLA 
1002 Barry Allen 
1002 Barry Allen 
1003 Hal  Jordan 
1003 Hal  Jordan DLA 
1003 Hal  Jordan 

我需要它返回此:

STU.ID STU.FN STU.LN PGM.CD 
1000 Bruce Wayne 
1001 Clark Kent DLA 
1002 Barry Allen 
1003 Hal  Jordan DLA 

我希望這一切纔有意義。謝謝您的幫助。

安東尼

回答

2

你應該使用這樣一個簡單的查詢:(!)

WITH CTE_PGM 
    AS 
    (
     SELECT PGM.PID, MAX( CASE PGM.CD 
     WHEN '200' THEN 'DLA' 
     ELSE '' 
     END) AS MaxCD 
     FROM PGM 
     GROUP BY PGM.PID 
    ) 
    SELECT STU.ID, STU.FN, STU.LN, MaxCD 
    FROM STU 
    INNER JOIN CTE_PGM ON STU.ID = CTE_PGM.PID 

嘗試使用SQL小提琴它是在一個快速回答一個很大的幫助。

我發了一個Example for you它是如何工作的。請檢查一下。

+0

謝謝。我不得不將它改爲'LEFT JOIN',因爲它沒有返回'STU'表中的每個記錄(並非所有的學生都在Programs表中有記錄),但是一旦我這樣做了,它就完美地工作了。感謝有關SQL小提琴(!)的信息。我不知道那件事。 –

+0

本網站有人向我展示了這一點,它非常有用:)我很高興它可以幫助你! –

+0

András,如果你有時間看下我對Mehdi的評論,你能解釋爲什麼使用'WITH AS'(帶有'MAX CASE')給出了正確的結果,而不是直接使用'MAX CASE' 'SELECT'? –

0

使用下面的查詢:

SELECT STU.ID, STU.FN, STU.LN, ISNULL(Max(Case When PGM.CD = 200 then 'DLA' Else '' End), '') as PGM_CD 
FROM STU 
Left JOIN PGM ON STU.ID = PGM.PID 
Group by STU.ID, STU.FN, STU.LN 
+0

謝謝。你的查詢返回的結果比上面的Andras'少,當我將兩個結果與'SELECT COUNT(*)FROM STU'進行比較時,Andras的查詢是正確的。我不太瞭解'WITH AS'和'MAX'知道爲什麼會是這種情況,但它會給我另外一些研究/學習。再次感謝。 –

+0

請檢查Andras的查詢結果。如果我的查詢結果不符合Andras查詢的結果;意味着在Andras查詢結果中存在一些學生的重複記錄。 –

+0

安東尼寫道,當他使用它時,他將我的INNER JOIN改爲LEFT JOIN,所以我認爲這可能是不同的。因爲基本上這兩個查詢具有完全相同的結果而沒有重複的可能性。 –

0
SELECT STU.ID, STU.FN, STU.LN, 
    max(CASE PGM.CD 
    WHEN '200' THEN 'DLA' 
    ELSE '') 
    END 
FROM STU 
LEFT JOIN PGM 
    ON STU.ID = PGM.PID 
group by STU.ID, STU.FN, STU.LN 
+0

謝謝。你的查詢返回的結果比上面的Andras'少,當我將兩個結果與'SELECT COUNT(*)FROM STU'進行比較時,Andras的查詢是正確的。我不太瞭解'WITH AS'和'MAX'知道爲什麼會是這種情況,但它會給我另外一些研究/學習。再次感謝。 –

+0

這裏你需要STU表的所有記錄嗎? – AnandPhadke

相關問題