【问题标题】:How can I count the amount of values in different columns in oracle plsql如何计算oracle plsql中不同列中的值的数量
【发布时间】:2021-11-17 15:14:41
【问题描述】:

例如,我有一个包含这些值的表:

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 和出现 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 中提出这个问题。我已经研究过枢轴,但我认为在这种情况下这对我没有帮助。

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

【问题讨论】:

  • 您还应该包括预期输出的样子。这在您的光标脚本中并不明显。
  • 实际上没有预期的输出。我只需要将数据放在另一个表中。

标签: oracle plsql count row multiple-columns


【解决方案1】:

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

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

【讨论】:

  • 这是 31 列,但我可以从这里继续。谢谢!
猜你喜欢
  • 1970-01-01
  • 2021-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-25
相关资源
最近更新 更多