Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle-每列的不同值_Oracle_Distinct - Fatal编程技术网

Oracle-每列的不同值

Oracle-每列的不同值,oracle,distinct,Oracle,Distinct,我知道也有过类似的讨论,但这有点不同 我需要在Oracle中进行查询,以获取给定表的值对(列名、不同值的计数) 例子:在这张桌子上 | ID | NAME | AGE | ____________________________________ | 01 | MARY | 10 | | 02 | MAX | 30 | | 03 | ALICE | 30 |

我知道也有过类似的讨论,但这有点不同

我需要在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       |
________________________________
问题是我不知道表的结构。我只需要表名,我需要为每个表名生成这些信息。
有什么想法吗?

你可以用一个
联合体来实现,例如

 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'

您可以使用
接头
执行此操作,例如

 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'

您可以使用
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

如果您使用的是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

请参见您可以使用
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

如果您使用的是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

请参见IDEA下面的

,您应该对其稍加改进:

create table stats_on_tables(
    date_id date, 
    table_name varchar2(32), 
    col_name varchar2(32), 
    cnt_distinct number
);
然后使用参数p_table_name创建一个过程,该过程:

for n in (select column_name from user_tab_columns where table_name = p_table_name)
loop
  execute immediate 
    'insert into stats_on_table (date_id, table_name, col_name, cnt_distinct)
     values (sysdate, '||p_table_name||','||n.column_name||', (
     select count(distinct '||n.column_name||') from '||p_table_name||' ))';
end loop;
commit;

在IDEA下面,您应该做一些工作:

create table stats_on_tables(
    date_id date, 
    table_name varchar2(32), 
    col_name varchar2(32), 
    cnt_distinct number
);
然后使用参数p_table_name创建一个过程,该过程:

for n in (select column_name from user_tab_columns where table_name = p_table_name)
loop
  execute immediate 
    'insert into stats_on_table (date_id, table_name, col_name, cnt_distinct)
     values (sysdate, '||p_table_name||','||n.column_name||', (
     select count(distinct '||n.column_name||') from '||p_table_name||' ))';
end loop;
commit;

每列的不同值数存储在系统表
USER\u TAB\u COL\u STATISTICS
中。通过调用过程
DBMS\u stats.GATHER\u TABLE\u 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  

每列的不同值数存储在系统表
USER\u TAB\u COL\u STATISTICS
中。通过调用过程
DBMS\u stats.GATHER\u TABLE\u 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  


你想让列名自动生成吗?我想第5行的ID 04应该是05。是的!!,我需要它们以数字形式生成你想以数字形式生成列名吗?我想第5行中的ID 04应该是05。是的!!,我需要生成DINAMICALI抱歉,lynamc,我忘了提到我想在不知道表结构的情况下执行此操作。我要的就是桌子的名字。你可以问甲骨文。请参见上面的编辑。如果它是一个大表,并且你想经常这样做,那么它就不太实用了。@Ciarán:特别是对于大表,向优化器提供良好的统计数据是非常实用的。但是
ANALYZE TABLE
已经过时了,应该改用
DBMS\u STATS
来代替。我经常这么做只是为了收集不同的统计数据,但是你当然完全正确,
ANALYZE TABLE
已经过时了,谢谢Wolfgang。对不起,lynamc,我忘了提到我想在不知道表结构的情况下执行此操作。我要的就是桌子的名字。你可以问甲骨文。请参见上面的编辑。如果它是一个大表,并且你想经常这样做,那么它就不太实用了。@Ciarán:特别是对于大表,向优化器提供良好的统计数据是非常实用的。但是
ANALYZE TABLE
已经过时了,应该改用
DBMS\u STATS
来代替。我经常这么做只是为了收集不同的统计数据,但是你当然完全正确,
ANALYZE TABLE
已经过时了,谢谢Wolfgang。对不起,蓝脚怪,我忘了提到我想在不知道表结构的情况下执行此操作。我所能得到的只是表名。对不起,蓝脚怪,我忘了在不知道表的结构的情况下提到我想这样做。我只要桌名,谢谢!当您没有时间/空间/权限生成统计信息时非常有用:)谢谢!在您没有时间/空间/权限生成统计信息时非常有用:)