如何计算oracle plsql中不同列中值的数量

How can I count the amount of values in different columns in oracle plsql

例如,我有一个 table 具有这些值:

ID Date Col1 Col2 Col3 Col4
1 01/11/2021 A A B
2 01/11/2021 B B

A、B值是动态的,也可以是其他字符。

现在我需要以某种方式得到 id 1 出现 2 次 A 和 1 次 B 的结果。Id 2 出现 0 次 A 和 2 次 B。

我正在使用动态 SQL 来执行此操作:

for v_record in table_cursor
loop
    for i in 1 .. 4
    loop
        v_query := 'select col'||i||' from table where id = '||v_record.id;
        execute immediate v_query into v_char;
        if v_char = "any letter I'm checking" then
            amount := amount + 1;
        end if;
    end loop;
    -- do somehting with the amount
end loop;

但是必须有更好更有效的方法来做到这一点。

我对 plsql 了解不多,我真的不知道如何在 google 中表述这个问题。我已经研究过 pivot,但我认为在这种情况下这对我没有帮助。

如果有人能帮助我,我将不胜感激。

假设 列的数量 固定为四,您可以在此处使用联合聚合方法:

WITH cte AS (
    SELECT ID, Col1 AS val FROM yourTable UNION ALL
    SELECT ID, Col2 FROM yourTable UNION ALL
    SELECT ID, Col3 FROM yourTable UNION ALL
    SELECT ID, Col4 FROM yourTable
)

SELECT
    t1.ID,
    t2.val,
    COUNT(c.ID) AS cnt
FROM (SELECT DISTINCT ID FROM yourTable) t1
CROSS JOIN (SELECT DISTINCT val FROM cte) t2
LEFT JOIN cte c
    ON c.ID = t1.ID AND
       c.val = t2.val
WHERE
    t2.val IS NOT NULL
GROUP BY
    t1.ID,
    t2.val;

这会产生:

Demo