SQL计数空值和非空值

时间:2013-06-05 09:31:33

标签: sql oracle

道歉,如果已经有了这方面的答案,我无法在任何地方找到它!

我想创建一个SQL查询(在Oracle中)显示所有A,B,C行的列表,例如下面的例子,其中D的计数超过1,包括Null。

说我有5列:

A   B   C     D    E 
1   1   100   A    1 
1   1   100        2 
1   1   200   A    3 
1   1   200        1 
2   2   100   A    2 
2   2   100        3
2   2   100   B    1
2   2   100   C    2

空白是空的。

我希望得到以下结果,完全忽略E:

A   B   C     count 
1   1   100   2
1   1   200   2
2   2   100   4

我目前遇到的问题是,如果我使用以下查询,则不计算空值:

SELECT A, B, C, count(D)
FROM <TABLE>
GROUP BY A, B, C HAVING COUNT(D) > 1

我知道count(*)确实考虑了空值,但我的表中还有其他列,我不希望在查询中包含这些列。

3 个答案:

答案 0 :(得分:1)

简单COUNT(*)`应该这样做

SELECT A, B, C, COUNT(*) count
  FROM table1
 GROUP BY A, B, C
 ORDER BY A, B, C

输出:

| A | B |   C | COUNT |
-----------------------
| 1 | 1 | 100 |     2 |
| 1 | 1 | 200 |     2 |
| 2 | 2 | 100 |     4 |

这是 SQLFiddle 演示

COUNT(*)只计算行数,因此它不关心NULL s。另一方面,当您指定列时,它将仅计算该列中具有非空值的行。

答案 1 :(得分:0)

如果你只是想要一个计数,并确保它计算每一行,即使你没有可计数的列可靠地不为空,只需使用SUM(1)COUNT(*)而不是指望柱;

SELECT A, B, C, SUM(1) dcount1, COUNT(*) dcount2
FROM Table1
GROUP BY A, B, C 
HAVING SUM(1) > 1

无论任何列是否为NULL,这都会对每一行进行计数。

An SQLfiddle to test with

答案 2 :(得分:0)

你所要求的是:

SELECT A, B, C, count(*)
FROM <TABLE>
GROUP BY A, B, C
HAVING COUNT(*) > 1

如果您希望计数基于D中的不同值,那么:

SELECT A, B, C, count(distinct coalesce(d,'!'))
FROM <TABLE>
GROUP BY A, B, C
HAVING count(distinct coalesce(d,'!')) > 1

选择一个值作为coalesce()的第二个参数,该参数从不存在于表中 - 最好是约束阻止存在的一个。