0

抱歉,如果已经有答案,我在任何地方都找不到!

我想创建一个 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(*) 确实考虑了空值,但我的表中有其他列我不想包含在我的查询中。

4

3 回答 3

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(*)只计算行数,因此它不关心NULLs。另一方面,当您指定列时,它将仅计算该列中具有非空值的行。

于 2013-06-05T09:42:32.280 回答
0

如果您只想要一个计数,并确保它计算每一行,即使您没有可靠地不为空的列来计数,只需使用SUM(1)orCOUNT(*)而不是对列进行计数;

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

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

一个用于测试的 SQLfiddle

于 2013-06-05T09:41:04.983 回答
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() 的第二个参数,该参数永远不会出现在表中——最好是一个约束阻止存在的值。

于 2013-06-05T09:41:52.403 回答