2013-03-15 77 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