如何在平面表中统计数据

时间:2013-06-24 09:00:51

标签: sql oracle

我有一个平面表,包含数千行和更多十列。我想为每一行计算每列(非空)。 例如,我在这里有平面表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 个答案:

答案 0 :(得分:4)

根据COUNT function documentation

  

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

因此您可以使用:

select aid, count(col1), count(col2), count(col3)
  from t
 group by aid

答案 1 :(得分:0)

考虑以下查询

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

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

如果你想计算不同的值

答案 2 :(得分:0)

Marco的答案是完美的。如果你的表很大并且计数的近似值是正常的,你可以查看数据字典。每次您(或您的DBA)调用DBMS_STATS.GATHER_TABLE_STATS时,它都会收集这些计数并将它们存储在视图中:

SELECT column_name, num_nulls 
  FROM user_tab_columns 
 WHERE table_name='A';

答案 3 :(得分:0)

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

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

Here is a sqlfiddle demo