2013-07-27 56 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;