1

同様のトピックについていくつかの議論があったことは知っていますが、これは少し異なります

特定のテーブルの値のペア (列名、個別の値の数) を取得するには、Oracle でクエリが必要です。

例:この表から

|   ID     |    NAME    |    AGE   |
____________________________________
|   01     |    MARY    |    10    |
|   02     |    MAX     |    30    |
|   03     |    ALICE   |    30    |
|   04     |    MARY    |    20    |
|   05     |    JOE     |    10    |
____________________________________

私は得る必要があります

|   COLUNL |    DIST. VALUES    |
________________________________
|   ID     |    5       |
|   NAME   |    4       | 
|   AGE    |    3       |
________________________________

問題は、テーブルの構造がわからないことです。テーブル名だけがあり、それぞれについてこの情報を生成する必要があります。何か案は?????

4

4 に答える 4

6

列ごとの個別の値の数は、システム テーブルに格納されますUSER_TAB_COL_STATISTICS。統計は、プロシージャを呼び出すことによって収集されますDBMS_STATS.GATHER_TABLE_STATS。DBA に問い合わせてください。すでに設定されているはずです。

CREATE TABLE mytable (id NUMBER, name VARCHAR2(10), age NUMBER);
INSERT INTO mytable VALUES (01, 'MARY',  10);
INSERT INTO mytable VALUES (02, 'MAX',   30);
INSERT INTO mytable VALUES (03, 'ALICE', 30);
INSERT INTO mytable VALUES (04, 'MARY',  20);
INSERT INTO mytable VALUES (04, 'JOE',   10);
COMMIT;
EXECUTE dbms_stats.gather_table_stats(user, 'MYTABLE');

SELECT table_name, column_name, num_distinct
  FROM user_tab_col_statistics
 WHERE table_name = 'MYTABLE';

TABLE_NAME COLUMN_NAME NUM_DISTINCT
MYTABLE    ID          4
MYTABLE    NAME        4
MYTABLE    AGE         3  
于 2012-12-13T14:06:25.687 に答える
0

UNIONこれは、たとえば...を使用して行うことができます。

 SELECT 'ID', Count(Distinct ID) As ValueCount From TableName
 UNION
 SELECT 'NAME', Count(Distinct NAME) From TableName
 UNION
 SELECT 'AGE', Count(Distinct AGE) From TableName

[編集]
別の方法は、テーブルを分析することです、例えば...

ANALYZE TABLE TABLENAME COMPUTE STATISTICS;

その後...

SELECT COLUMN_NAME, NUM_DISTINCT FROM USER_TAB_COLUMNS WHERE TABLE_NAME = 'TABLENAME'
于 2012-12-13T12:57:33.767 に答える
0

UNION ALLクエリを使用しUNPIVOTてデータをカウントできます。

select col col_name,
  count(distinct value)
from
(
  select cast(id as varchar(10)) value, 'id' col
  from yourtable
  union all
  select name value, 'name' col
  from yourtable
  union all
  select cast(age as varchar(10)) value, 'age' col
  from yourtable
) 
group by col

デモで SQL Fiddle を参照してください

Oracle 11g+ を使用している場合は、UNPIVOT関数を使用してこれを実行できます。

select col, count(distinct value) CountofValue
from
(
  select cast(id as varchar(10)) id, 
    name, 
    cast(age as varchar(10)) age
  from yourtable
) 
unpivot
(
  value
  for col in (id, name, age)
) 
group by col

デモで SQL Fiddle を参照してください

于 2012-12-13T12:58:36.393 に答える