如何统计Oracle数据库表中跨所有列的Yes和No的总数量
Oracle多列Yes/No总数量统计方案
实现思路
不需要用PIVOT(行转列),反过来用UNPIVOT(列转行)就能实现需求:先把所有存储Yes/No的列转为同一个字段下的多行值,再分组统计数量即可。
静态写法(推荐,列数固定时使用)
假设你的表名为your_table,存储Yes/No的列名为col1、col2、col3、col4,替换为你实际的表名和列名即可:
SELECT value 取值, COUNT(*) 总数量 FROM your_table UNPIVOT ( value FOR 原列名 IN (col1, col2, col3, col4) ) WHERE value IN ('Yes', 'No') -- 如需过滤非Yes/No的异常值保留该行,不需要可删除 GROUP BY value -- 如需输出总计行,添加下面这部分代码 UNION ALL SELECT '总计' 取值, COUNT(*) 总数量 FROM your_table UNPIVOT ( value FOR 原列名 IN (col1, col2, col3, col4) ) WHERE value IN ('Yes', 'No') ORDER BY 取值;
动态写法(列数较多或频繁变动时使用)
如果表中Yes/No列数量多,不想手动逐个写列名,可以用动态SQL生成查询语句:
DECLARE v_cols VARCHAR2(1000); v_sql VARCHAR2(2000); BEGIN -- 生成所有列名,默认取当前用户下your_table表的所有VARCHAR2类型列,可自行调整过滤条件 SELECT LISTAGG(column_name, ',') WITHIN GROUP (ORDER BY column_id) INTO v_cols FROM user_tab_columns WHERE table_name = 'YOUR_TABLE' -- 替换为你的表名,注意大写 AND data_type = 'VARCHAR2'; v_sql := 'SELECT value 取值, COUNT(*) 总数量 FROM your_table UNPIVOT (value FOR 原列名 IN ('||v_cols||')) WHERE value IN (''Yes'',''No'') GROUP BY value'; -- 执行动态查询,如需打印结果可自行添加DBMS_OUTPUT输出逻辑 EXECUTE IMMEDIATE v_sql; END; /
内容的提问来源于stack exchange,提问作者Havishaa Sharma
相关产品推荐
相关产品推荐

