2017-07-17 60 views
0

我想根據StudentID將下面的CTE分組,並且我想用一條規則來計算結果,如果他傳遞的是一個主題,那麼他將傳遞一個主題(如果不失敗) 。如何處理組中的字段

WITH mycte(StudentId,SubjectId,Result) as 
    (SELECT 1,1,'pass' 
    UNION ALL SELECT 1,2,'fail' 
    UNION ALL SELECT 1,3,'pass' 
    UNION ALL SELECT 2,1,'fail' 
    UNION ALL SELECT 2,2,'fail' 
    UNION ALL SELECT 3,1,NULL 
    ) 

你能幫我理解如何實現這個邏輯。

預期的結果是一樣

StudentID Result 
1   pass 
2   fail 
3   NULL 

回答

2

您可以聚集在學生數遍數。根據你的邏輯,如果看到一次傳球,那麼這名學生應該被認爲是全面傳球。

SELECT DISTINCT 
    t1.StudentId, 
    t2.Result 
FROM mycte t1 
LEFT JOIN 
(
    SELECT 
     StudentId, 
     CASE WHEN SUM(CASE WHEN Result = 'pass' THEN 1 ELSE 0 END) > 0 
      THEN 'pass' 
      WHEN SUM(CASE WHEN Result = 'fail' THEN 1 ELSE 0 END) > 0 
      THEN 'fail' 
      ELSE NULL END AS Result 
    FROM mycte 
    GROUP BY StudentId 
) t2 
    ON t1.StudentId = t2.StudentId 
+0

謝謝蒂姆。我想我沒有寫清楚這個問題。我已經用預期的結果更新了這個問題。您提供的查詢僅限於通過的學生。 –

+0

@MuthukumarPalaniappan我更新了我的查詢。 –

+0

它的工作原理。萬分感謝。 –

3

試試這個簡單的方法

SELECT StudentId, 
     Result = Max(Result) 
FROM mycte 
GROUP BY StudentId 

這裏的技巧是PassFail後的字符串順序進行排序。所以,當你使用Max聚合,我們將得到Pass,如果至少有一個Pass存在

+0

好的事Radheep。 –