sql - Oracle 中的数据透视表?

标签 sql database oracle pivot unpivot

我有一个包含许多列的表,用于指定错误是否有效。我需要以这样一种方式输出:将错误指定为行的列名称以及每个错误的有效和无效字段的计数。

下面类似输入和预期输出的示例

id   name            txn_column_name  flag1 flag2 flag3 
1    Resident Count  resident_ct      Y     Y     N
2    Incident Count  incident_ct      Y     Y     Y
3    Facility Status facil_stat       N     N     N

需要输出

Col1_name Y_Count    N_Count
flag1       2            1
flag2       2            1
flag3       1            2

最佳答案

我们可以在这里尝试使用 Oracle 的 UNPIVOT 运算符:

SELECT
    flag AS Col1_name,
    COUNT(CASE WHEN val = 'Y' THEN 1 END) AS Y_Count,
    COUNT(CASE WHEN val = 'N' THEN 1 END) AS N_Count
FROM yourTable
UNPIVOT
(
    val FOR (flag) IN (
        flag1 AS 'flag1',
        flag2 AS 'flag2',
        flag3 AS 'flag3'
    )
)
GROUP BY
    flag
ORDER BY
    flag;

Demo

另一个直接的选择是使用一系列联合:

SELECT
    'flag1' AS Col1_name,
    COUNT(CASE WHEN flag1 = 'Y' THEN 1 END) AS Y_Count,
    COUNT(CASE WHEN flag1 = 'N' THEN 1 END) AS N_Count
FROM yourTable
UNION ALL
SELECT 'flag2', COUNT(CASE WHEN flag2 = 'Y' THEN 1 END),
    COUNT(CASE WHEN flag2 = 'N' THEN 1 END)
FROM yourTable
UNION ALL
SELECT 'flag3', COUNT(CASE WHEN flag3 = 'Y' THEN 1 END),
    COUNT(CASE WHEN flag3 = 'N' THEN 1 END)
FROM yourTable
ORDER BY 1;

Demo

关于sql - Oracle 中的数据透视表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52619399/

相关文章:

oracle - org.hibernate.Query .iterate() VS .getResultList() 查询生成

sql - SQL 中状态列的 Varchar(10) 或 int

mysql - Haversine 公式在查询中返回 null

oracle - SSH隧道连接到Oracle数据库

MySQL LEFT JOIN 仅返回右表上带有 where 条件的一行

python - 如何制作脚本以在我的默认 sqlite3 数据库 django 中插入数据

Oracle AQ - 队列消息复制

PHP 为每个表行数据添加值

sql - 您可以使用 CASE 语句来评估您传递给存储过程的参数吗?

sql - 在 Select 语句中使用存储过程的结果