2017-07-17 30 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。 –