【问题标题】:Transpose log rows to multiple colums in PL/SQL在 PL/SQL 中将日志行转置为多列
【发布时间】:2017-11-08 17:31:25
【问题描述】:

我的公司将 Log_Info 存储在一张表中,其中包含工厂 id、部门 id、日志日期、日志小时、日志分钟以及计数器值。请帮助我如何将 [Log hour + Log min] 转换为列,正如我们在本例中使用 Oracle Database 10g 版本 10.2 中的 PL/SQL 看到的那样。

非常感谢。

【问题讨论】:

  • Please don't post images when you don't have to。以格式化文本显示您的原始数据、预期结果和您当前的最佳尝试,并解释您遇到的问题。这真的需要涉及 PL/SQL 吗?
  • 感谢您的回答。我可以用C#生成结果,但是数据量很大,一两年的时间,用foreach检查再一一填充很慢。但是直接在 SQL 中选择非常快,所以我希望 PL/SQL 是一个不错的选择。再次感谢。

标签: sql plsql oracle10g


【解决方案1】:

我会告诉你使用 PIVOT,这是一种非常简单的本地执行此类操作的方法,但不幸的是,我相信它是在 11g 中引入的。据我所知,您有两种选择;如果您想保留在原生 SQL 中,则必须使用硬编码的 case 语句。否则,此解决方案可能对您有用..

declare v_str varchar2(2000);
begin
v_str:='select factoryid,deptid,logdate';
for i in (select distinct 'H'||loghour||'_'||logmin a from test_table order by a) loop
    v_str:=v_str||',max(case ''H''||loghour||''_''||logmin when '''||i.a||''' then counter end) as "'||i.a||'"';
end loop;
    v_str:=v_str||' from test_table group by factoryid,deptid,logdate order by factoryid';
    DBMS_OUTPUT.PUT_LINE(v_str);
end;

这将为您提供一个动态查询,然后您可以在循环或结果集中执行该查询,无论您选择什么(而不是我在这里的 PUT_LINE)。根据您提供的当前数据,此块的结果是:

    select factoryid,deptid,logdate,
max(case 'H'||loghour||'_'||logmin when 'H0_0' then counter end) as "H0_0",
max(case 'H'||loghour||'_'||logmin when 'H0_30' then counter end) as "H0_30",
max(case 'H'||loghour||'_'||logmin when 'H1_0' then counter end) as "H1_0",
max(case 'H'||loghour||'_'||logmin when 'H1_30' then counter end) as "H1_30",
max(case 'H'||loghour||'_'||logmin when 'H2_0' then counter end) as "H2_0" 
from test_table 
group by factoryid,deptid,logdate order by factoryid

这将为您提供所需的准确信息。

编辑:请注意,包含 MAX 是为了消除 case 语句中的所有内容,使其不属于 group by。这是假设每个工厂 id/deptid/logdate 每次只有一个计数器值。

如果您想走本地路线并有一个定义的 loghour 和 logmin 列表(不是 100% 肯定,但看起来您会从 H0_0 到 H23_30),您可以使用查询 PL/ SQL 块在上面吐出,并继续创建 case 语句,直到所有 loghours 和 logmins 都被考虑在内。如果是这种情况并且 loghour/min 具有定义的跨度,则应该这样做,因为使用原生 SQL 优于动态 SQL 会带来性能优势,例如游标缓存。

【讨论】:

    猜你喜欢
    • 2020-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 2014-08-25
    相关资源
    最近更新 更多