2009-08-27 72 views
1

我試圖計算FLOOR有多少不同的值,但我不想將值「B」計入總數。SQL Distinct計數,但有一個例外

這是我目前的代碼。它記錄了有多少個不同的樓層,但是當有一個時,它包括樓層「B」。

SELECT COUNT(DISTINCT FLOOR) as NB_FLOORS FROM TABLE_ID 

表看起來是這樣的:

FLOOR  ROOM 
B   Bedroom 
1   Kitchen 
1   Bathroom 
2   Bedroom 
2   Bedroom 

在這種情況下,結果shoudl是2,因爲有2層樓(「B」是不計入地板地下室) 。我目前得到3我與張貼的代碼。

謝謝。

回答

9
SELECT COUNT(DISTINCT FLOOR) as NB_FLOORS FROM TABLE_ID WHERE FLOOR <> 'B' 
+0

哈哈,我怎麼沒有想到這一點。我需要開始思考簡單而不是複雜的...謝謝! – Enkay 2009-08-27 18:41:37

+0

np :) ..隨時 – waqasahmed 2009-08-28 01:17:09

0

下面是依靠COUNT()忽略空的解決方案:

SELECT COUNT(DISTINCT CASE FLOOR = 'B' THEN NULL ELSE FLOOR END) AS NB_FLOORS 
FROM TABLE_ID; 

另一種思考:假設樓層號始終從1開始,不跳過的數字,你可以簡單地返回MAX()

SELECT MAX(FLOOR) AS NB_FLOORS FROM TABLE_ID; 
+0

謝謝!在這種情況下,不幸的方法#2不起作用,但我用你建議的第一種方法學了一些東西。 – Enkay 2009-08-27 18:53:29

0

如果您想要更通用的解決方案,請使用正則表達式

選擇COUNT(DISTINCT FLOOR)作爲NB_FLOORS FROM TABLE_ID其中FLOOR REGEXP'[0-9]'

+0

感謝您的回答。雖然你的建議可以用於這個例子,但我碰巧有地板由字母表示。 – Enkay 2009-08-27 18:54:58

+0

你希望能夠控制是否用字母計算樓層,或者看起來好像。你是否只想排除「B」,如果是的話,那麼正則表達式就是[^ B]。無論哪種方式,正則表達式將使您的代碼更易於管理,並且更易於擴展,IMO。當你想排除'R'和'L'時會發生什麼 - 繼續向你原來的WHERE添加ANDS? – IniTech 2009-08-27 19:02:35