嵌套CASE语句以排除某些行

时间:2013-03-15 13:46:16

标签: sql oracle10g case

示例数据:Oracle 10g

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

我需要做的是生成没有活动或x活动的行,然后出现问题:如果有一个同时具有x活动且没有活动的ID,我只想生成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 个答案:

答案 0 :(得分:2)

您可以在案例陈述中放置MAX()而在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

答案 1 :(得分: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,我们将不得不创建子查询。