2013-03-15 75 views
1

样本数据:Oracle 10g的嵌套CASE语句来排除某些行

Number Activity 
1   x Activity 
1   no activity 
2   x activity 
3   no activity 

我需要做的就是产生行,其中有或者没有活动或x活动,然后是什么问题:如果有一个ID既有x活动也没有活动,我只想产生x个活动行。可以做到吗?这里是CASE声明产生上面的数据:

CASE WHEN DSKMTB_ACTIVITY_TYPE.ACTIVITY_TYPE_LABEL IS NULL 
     THEN 'No Activity' 
     ELSE DSKMTB_ACTIVITY_TYPE.ACTIVITY_TYPE_LABEL 
    END AS "Activity Type" 

我想我需要嵌套CASE语句,但我不能完全收集的逻辑在我的头上。请让我知道是否有什么我可以帮助的。按照惯例,我没有在这里包含整个查询,因为它非常大,但如果有人觉得有必要,会进行编辑。提前致谢。

回答

2

通过由ID分组与过滤你可能通过它:

SELECT 
    CASE 
     WHEN MAX(NVL(a.ACTIVITY_TYPE_LABEL, 'aaaa')) = 'aaaa' 
      THEN 'No Activity' 
     ELSE a.ACTIVITY_TYPE_LABEL 
    END AS "Activity Type" 
FROM DSKMTB_ACTIVITY_TYPE a 
GROUP BY a.id 

的问题是,如果你真的选择等领域,它可能会打破GROUP BY,我们将不得不做出一个子查询。

+0

谢谢,那没有工作。我是SQL的新手,并且觉得我有时滥用MAX()来消除重复的行,因此不愿意使用它。看起来在这些情况下是必要的。再次感谢您的帮助! – user1983682 2013-03-15 14:02:19

2

您可以将MAX()放在case语句的周围,并且在ID字段上输入GROUP BY

MAX(CASE WHEN DSKMTB_ACTIVITY_TYPE.ACTIVITY_TYPE_LABEL IS NULL 
     THEN 'No Activity' 
     ELSE DSKMTB_ACTIVITY_TYPE.ACTIVITY_TYPE_LABEL 
    END) AS "Activity Type" 


GROUP BY ID 
+0

谢谢JWK,我很感激帮助。 – user1983682 2013-03-15 14:03:00

+0

JWK,因为我们在同一时间发布,所以我也赞成你们。相同的答案。 – Sebas 2013-03-15 14:06:11