You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何统计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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 12:09:03