2013-07-27 27 views
0

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

例如有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,因为每个属性都有一个疯狂的计数()空行,然后手动计算()非视图中相同属性的空行:) 有没有人面临这样的任务?我会感谢您的意见和帮助。

+0

原来是你寻找Oracle特定的方式来计算列中的空值/非空值,而不实际读取数据? – EvilTeach

+0

嗯,不完全是。我试图避免手动列出所有属性的count(*)或count(属性)函数。我只是想,是否可以创建一个变量为view_name和column_name的过程,并使用循环为选定表中的每个属性计算所有Nulls和Nulls行。如果有可能的话,请分享一些例子。预先感谢您.. –

+0

我认为您可以从USER_TAB_COLS获取您想要的信息。去你并做好工作。 –

回答

1

由于行数是COUNT(*),就可以得到每列空和非空行有:

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 
+0

谢谢,大卫。但在这种情况下,我要避免这种做法。我的意思是,如果我只有一张桌子,这将是很大的挑战,但在我的情况下,有超过60个视图,每个视图都包含20-30个属性。让我们想象一下,我需要支持这样的脚本。所以每次添加新属性时,我都必须为每个属性创建一个额外的案例。有没有另外一种方法来使用动态SQL或PL/SQL来检索这些信息? –

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;