2009-08-27 68 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

相关问题