例如,我有一個包含這些值的表:
| ID | 日期 | 第 1 列 | Col2 | 第 3 列 | Col4 |
|---|---|---|---|---|---|
| 1 | 01/11/2021 | 一種 | 一種 | 乙 | |
| 2 | 01/11/2021 | 乙 | 乙 |
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 中制定這個問題。我已經研究了支點,但我認為在這種情況下這對我沒有幫助。
如果有人可以幫助我,我將不勝感激。
uj5u.com熱心網友回復:
假設列數固定為四,您可以在此處使用聯合聚合方法:
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;
這產生:

演示
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/361920.html
