如何在Oracle中用SELECT语句生成B、C值组合的统计矩阵?
Oracle 实现行列转换的统计矩阵查询
可以通过单条SELECT语句实现需求,不需要建表或编写额外脚本,核心思路是用条件聚合配合CTE生成所有可能的Column C值,确保统计矩阵包含所有预期的行和列。
完整查询语句
假设你的表名为your_table,替换为实际表名即可:
WITH c_values AS ( SELECT '0' AS col_c FROM DUAL UNION ALL SELECT '1' FROM DUAL UNION ALL SELECT '2' FROM DUAL UNION ALL SELECT '3' FROM DUAL UNION ALL SELECT '4' FROM DUAL UNION ALL SELECT '5' FROM DUAL UNION ALL SELECT '6' FROM DUAL UNION ALL SELECT '7' FROM DUAL UNION ALL SELECT '8' FROM DUAL UNION ALL SELECT '9' FROM DUAL UNION ALL SELECT 'A' FROM DUAL ) SELECT cv.col_c AS "Column C", COUNT(CASE WHEN t.column_b = 0 THEN 1 END) AS "B=0", COUNT(CASE WHEN t.column_b = 1 THEN 1 END) AS "B=1", COUNT(CASE WHEN t.column_b = 3 THEN 1 END) AS "B=3", COUNT(CASE WHEN t.column_b = 7 THEN 1 END) AS "B=7" FROM c_values cv LEFT JOIN your_table t ON cv.col_c = t.column_c GROUP BY cv.col_c ORDER BY cv.col_c;
关键部分说明
生成所有Column C的可能值
- 用CTE
c_values构造Column C的全部唯一值集合(0-9、A),确保即使没有对应记录的C值也会出现在结果的行中,避免遗漏。
- 用CTE
条件聚合统计
- 每个Column B的可能值作为单独一列,通过
COUNT(CASE ...)实现条件统计:当column_b等于目标值时返回1,否则返回NULL,COUNT会自动忽略NULL值,最终得到该B、C组合的记录数。
- 每个Column B的可能值作为单独一列,通过
LEFT JOIN 保留所有行
- 通过
LEFT JOIN关联原表,保证c_values中的所有C值都被保留,不会因为原表中无对应记录而消失。
- 通过
执行结果示例
针对你提供的样本数据,执行后会得到如下结果:
| Column C | B=0 | B=1 | B=3 | B=7 |
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 |
| 1 | 0 | 0 | 0 | 0 |
| 2 | 0 | 0 | 0 | 0 |
| 3 | 0 | 0 | 2 | 1 |
| 4 | 0 | 0 | 0 | 0 |
| 5 | 0 | 0 | 0 | 0 |
| 6 | 0 | 0 | 0 | 0 |
| 7 | 0 | 1 | 0 | 0 |
| 8 | 0 | 0 | 0 | 0 |
| 9 | 0 | 0 | 0 | 0 |
| A | 1 | 0 | 0 | 0 |
内容的提问来源于stack exchange,提问作者Logy Tegus
相关产品推荐
相关产品推荐

