sql - 使用 Oracle SQL 获取表中所有列的值计数

标签 sql sql-server oracle

由于各种原因,我工作的组织将数据存储在 Oracle 和 MS SQL 服务器数据库中。我们正在移动一些静态历史数据,我必须检查数据是否已正确移动。 下面的查询检查 SQL Server 中的数据并生成一个表,列出表中每一列中所有值的计数。 由于 Oracle 中的格式差异,我需要按另外两个列 Year 和 Iteration_count 进行分组。我无法遍历在 Oracle 中工作的表中的所有列,因为我的经验非常局限于 SQL Server

DECLARE @SQL NVARCHAR(MAX) = ''
SELECT @SQL = STUFF((SELECT ' UNION SELECT ''' + name 
                            + ''' AS [Column], ' 
                            + 'CAST(' + QUOTENAME(Name)
                            + ' AS NVARCHAR(MAX)) AS [ColumnValue], COUNT(*) AS [Count] FROM ' 
                            +'dbo.HES_APC_ACP_9798' 
                            +' where (NUMACP IS NOT NULL AND NOT (NUMACP = 0) ) '
                            +' GROUP BY ' + QUOTENAME(Name)
                            --+'Order By [Column],[ColumnValue]'
                    FROM   sys.columns 
                    WHERE  object_id = Object_id('dbo.HES_APC_ACP_9798' )

                    FOR XML PATH ('')), 1, 7, '');

EXECUTE sp_executesql @SQL;

最佳答案

user_tab_columns 上的这个循环应该有帮助:

declare
  v_table varchar2(30) := 'TEST';
  v_sql varchar2(32767);
begin
  for r in (select column_name name from user_tab_cols 
              where table_name=v_table order by column_id)
  loop
    v_sql := v_sql||' union all select '''||r.name||''' col_name, to_char('
                  ||r.name||') col_value, count(1) cnt from '||v_table
                  ||' group by '||r.name||chr(13);
  end loop;
  v_sql := ltrim(v_sql, ' union all ');
  dbms_output.put_line(v_sql);
end;

测试表:

create table test (col1 varchar2(10), col2 number(5), col3 date);
insert into test values ('ABC', 1, null);
insert into test values ('DEF', 1, date '2015-06-18');

执行第一个 PLSQL block 输出:

select 'COL1' col_name, to_char(COL1) col_value, count(1) cnt from TEST group by COL1
 union all select 'COL2' col_name, to_char(COL2) col_value, count(1) cnt from TEST group by COL2
 union all select 'COL3' col_name, to_char(COL3) col_value, count(1) cnt from TEST group by COL3

此查询的输出:

COL_NAME COL_VALUE           CNT
-------- ------------ ----------
COL1     DEF                   1
COL1     ABC                   1
COL2     1                     2
COL3                           1
COL3     15/06/18              1

如果您从其他模式读取数据,请使用 all_tab_cols 并为 owner 添加过滤器。您还可以使用 execute immediate 语句运行生成的查询。

关于sql - 使用 Oracle SQL 获取表中所有列的值计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34063363/

相关文章:

sql - Google 查询 - "NOT LIKE"语句不起作用

SQL Server - 从表中获取 DISTINCT 记录的查询

SQL Server - 有条件地增加计数器

sql-server - 我需要在一个语句中进行多个计算

sql-server - TSQL XML - 在交叉应用时过滤节点 LIKE 'x'

c# - 如何在C#中确定现有的oracle数据库连接?

mysql - 数据集中不同名称的平均长度

sql - SQL Server 中的别名列名

oracle - Logstash Oracle JDBC(无法加载 ojdbc8.jar)

sql - Oracle 中的 INSTR 和 LIKE 有什么区别?