道歉,如果已经有了这方面的答案,我无法在任何地方找到它!
我想创建一个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(*)确实考虑了空值,但我的表中还有其他列,我不希望在查询中包含这些列。
答案 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,这都会对每一行进行计数。
答案 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()的第二个参数,该参数从不存在于表中 - 最好是约束阻止存在的一个。