在oracle中计算每个属性的null和非null行数

时间:2013-07-27 11:35:53

标签: sql oracle plsql count

是否有解决方案如何计算视图中每个属性的NULL和NOT NULL记录数?

例如,有50个视图,每个视图有20个属性,我期待的结果看起来像(例如):

table_name -----Column_name---Nulls_count----Not_null_count------count(*)

T1 -----------------C1-------------------20---------------40-----------------------60          
T1------------------C2-------------------11--------------49---------------------60
T1------------------C3-------------------25--------------35---------------------60
T2------------------C1-------------------0--------------100---------------------100
T2------------------C2-------------------40--------------60---------------------100

所有视图都存储在sys.all_views中,列位于sys.all_tab_columns中,并且table_name字段之间存在链接。但是需要使用动态SQL或PL / SQL,因为对于每个属性计数()空行然后计算()非空行以查找相同属性是疯狂的。手动查看:) 有没有人面对这样的任务?我将非常感谢您的所有意见和帮助。

2 个答案:

答案 0 :(得分:1)

由于行数是count(*),因此每列可以获得null和非null行:

select
  count(*)               total_rows  ,
  count(col1)            col1_nonnull,
  count(*) - count(col1) col1_null   ,
  count(col2)            col2_nonnull,
  count(*) - count(col2) col2_null   ,
  ...
from
  my_view

答案 1 :(得分:0)

这是正确的选择:

 select t.table_name, T.NUM_ROWS, c.column_name, c.num_nulls, T.NUM_ROWS -  c.num_nulls  num_not_nulls, c.data_type, c.last_analyzed
from all_tab_cols c
join sys.all_all_tables t on C.TABLE_NAME = t.table_name
 where c.table_name like 'MV_%' and c.nullable ='Y'
 group by t.table_name, T.NUM_ROWS, c.column_name, c.num_nulls, c.data_type, c.last_analyzed
  order by t.table_name, c.column_name;