0

我有一张由数千行和十多列组成的平面表。我想计算每一行的每一列(非空)。例如,在这里我有一张平桌说table A

+=====+======+======+======+=====+======+
| Aid | col1 | col2 | col3 | ... |col10 |
+=====+======+======+======+=====+======+
|  1  |   a  |   b  |   c  | ... |   x  |
+-----+------+------+------+-----+------+
|  2  |   a  |   b  |   c  | ... |   x  |
+-----+------+------+------+-----+------+
|  3  |   a  |   b  |   c  | ... |   x  |
+-----+------+------+------+-----+------+

现在,我想在单个查询中计算所有 Aid 的所有列(非空)。例如,如果我对 col1 进行计数,那么我需要使用 select count(*) from A where col1 is not null; 但我希望单个查询中表中每个 Aid 的所有列计数(非空值)。我怎么能这样做?

4

4 回答 4

4

根据COUNT 函数文档

如果您指定expr,则 COUNT 返回expr不为空的行数。

因此,您可以使用:

select aid, count(col1), count(col2), count(col3)
  from t
 group by aid
于 2013-06-24T09:11:47.097 回答
0

考虑以下查询

select count(a), count(b), count(c)....
  from table_name

或者

select count(distinct a), count(distinct b), count(distinct c), ...
  from table_name

如果你想计算不同的值

于 2013-06-24T10:54:52.710 回答
0

马可的回答是完美的。如果您的表很大并且计数的近似值还可以,那么您不妨看看数据字典。每次您(或您的 DBA)调用 DBMS_STATS.GATHER_TABLE_STATS 时,它都会准确收集这些计数并将它们存储在视图中:

SELECT column_name, num_nulls 
  FROM user_tab_columns 
 WHERE table_name='A';
于 2013-06-24T11:52:53.653 回答
0

如果您使用的是 11g,则可以使用unpivot,然后在 Aid 上使用 group by 计数:

select aid,count(*) 
from tablea
unpivot
(
  vals for col_name in (col1, col2, col3, ..., col10)
  )
group by aid
order by aid

这是一个 sqlfiddle 演示

于 2013-06-25T06:19:45.137 回答