【问题标题】:SQL Distinct Count with an exceptionSQL Distinct Count 异常
【发布时间】:2010-11-23 12:00:21
【问题描述】:

我正在尝试计算 FLOOR 有多少不同的值,但我不希望值“B”计入总数。

这是我当前的代码。它计算有多少不同的楼层,但当有一层时,它包括楼层“B”。

 SELECT COUNT(DISTINCT FLOOR) as NB_FLOORS FROM TABLE_ID

表格看起来像这样:

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

在这种情况下,结果应该是 2,因为有 2 个楼层(“B”是不计为楼层的地下室)。我发布的代码目前得到 3 个。

谢谢。

【问题讨论】:

    标签: sql exception count distinct


    【解决方案1】:

    如果您想要更通用的解决方案,请使用正则表达式

    SELECT COUNT(DISTINCT FLOOR) as NB_FLOORS FROM TABLE_ID WHERE FLOOR REGEXP '[0-9]'

    【讨论】:

    • 感谢您的回答。虽然你的建议适用于这个例子,但我碰巧有用字母表示的楼层。
    • 并且您希望能够控制是否用字母计算楼层,或者看起来是这样。您是否只想排除“B”,如果是,则正则表达式将是 [^B]。无论哪种方式,正则表达式都会使您的代码更易于管理且更易于扩展,IMO。当您想排除“R”和“L”时会发生什么 - 继续在原始 WHERE 中添加 ANDS?
    【解决方案2】:

    这是一个依赖 COUNT() 忽略 NULL 的解决方案:

    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;
    

    【讨论】:

    • 谢谢!不幸的是,方法#2 在这种情况下不起作用,但我从你建议的第一种方法中学到了一些东西。
    【解决方案3】:
    SELECT COUNT(DISTINCT FLOOR) as NB_FLOORS FROM TABLE_ID WHERE FLOOR <> 'B'
    

    【讨论】:

    • 哈哈,我怎么没想到。我需要开始思考简单而不是复杂......谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-30
    • 1970-01-01
    • 2016-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-10
    相关资源
    最近更新 更多