首页 > 解决方案 > 从 Oracle DB 中的完整表数据中计算特定匹配

问题描述

无论列如何,我都想从下表数据中计算“是”和“否”。

甲骨文数据库表:

Oracle 数据库表

预期输出:

在此处输入图像描述

它来自哪一列并不重要。我只想计算“是”和“否”的总数。我尝试使用数据透视,但找不到如何将其用于多列的方法。

请帮忙。

标签: sqloracle

解决方案


如果它必须是动态的,那么......它必须是动态的,这意味着 PL/SQL 是做你想做的事情的一个选项。这是一个例子:

循环遍历名称作为参数传递的表中的所有列并计算作为第二个参数传递的值的数量的函数:

SQL> create or replace function f_yes_no
  2    (par_table_name in varchar2, par_yes_no in varchar2)
  3    return number
  4  is
  5    l_cnt  number;
  6    retval number := 0;
  7  begin
  8    for cur_r in (select column_name from user_tab_columns
  9                  where table_name = dbms_assert.sql_object_name(par_table_name)
 10                    and data_type like '%CHAR%'
 11                 )
 12    loop
 13      execute immediate
 14        'select count(*) from ' || dbms_assert.sql_object_name(par_table_name) ||
 15        '  where ' || cur_r.column_name || ' = ' ||
 16        dbms_assert.enquote_literal(par_yes_no)
 17        into l_cnt;
 18      retval := retval + l_cnt;
 19    end loop;
 20    return retval;
 21  end;
 22  /

Function created.

SQL>

测试:样品表:

对于示例表:

SQL> select * from test;

ZING  PLING COL3  BOING
----- ----- ----- -----
Yes   No    Yes   No
Yes   No    No    No
No    No    Yes   No

SQL> select f_yes_no('TEST', 'Yes') cnt_yes,
  2         f_yes_no('TEST', 'No' ) cnt_no
  3  from dual;

   CNT_YES     CNT_NO
---------- ----------
         4          8

SQL>

它有什么好处?MANAGER您可以将该函数重用于另一个表中的其他字符串,例如Scott 的表中有多少个 s EMP

SQL> select ename, job from emp order by job;

ENAME      JOB
---------- ---------
SCOTT      ANALYST
FORD       ANALYST
MILLER     CLERK
JAMES      CLERK
SMITH      CLERK
ADAMS      CLERK
BLAKE      MANAGER
JONES      MANAGER
CLARK      MANAGER
KING       PRESIDENT
TURNER     SALESMAN
MARTIN     SALESMAN
WARD       SALESMAN
ALLEN      SALESMAN

14 rows selected.

SQL> select f_yes_no('EMP', 'MANAGER') cnt_mgr from dual;

   CNT_MGR
----------
         3

SQL>

推荐阅读