sql - 从 Oracle DB 中的完整表数据中计算特定匹配
问题描述
无论列如何,我都想从下表数据中计算“是”和“否”。
甲骨文数据库表:
预期输出:
它来自哪一列并不重要。我只想计算“是”和“否”的总数。我尝试使用数据透视,但找不到如何将其用于多列的方法。
请帮忙。
解决方案
如果它必须是动态的,那么......它必须是动态的,这意味着 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>
推荐阅读
- botframework - 有没有办法使用自适应卡实现呼叫功能(打开拨号器)?
- python - 如何让机器人在每个命令中给出不同的值
- python - 访问 JSON 对象中的元素
- php - 有没有办法减少循环次数
- php - set_exception_handler 未捕获类异常
- node.js - 在 node_modules/pino/pino.js:9 const { assertDefaultLevelFound, mappings, genLsCache } = require('./lib/levels') 中出现错误
- php - 使用 New Relic Infrastructure 代理的多行应用程序日志解析器
- python - Pandas Dataframe 3D 曲面图
- sql - 我在写游标时收到错误 ORA-01001 无效游标显示偶数条记录
- javascript - 如何在JSX中仅链接一个.map数组的一个元素