如何计算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;
这会产生:
例如,我有一个 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;
这会产生: