oracle行转列(oracle中几种常用的行转列方法)

说实话,行转列是报表开发中不可避免的一个障碍。
以Oracle中Scott的emp表为例。
传统的统计各部门人员分布的方法非常麻烦。

方法1 使用decode函数来堆叠集合。
刚开始创业的时候,我被骗过很多次。
例如,这个 SQL: sql 选择t.job; count(解码(t.deptno,'1 0',1 ))为“1 0(DEPTNO)”; 计数(解码(t.deptno,'2 0',1 ))为“2 0(DEPTNO)”; 计数(解码(t.deptno,'3 0',1 ))为“3 0(DEPTNO)”; 计数(解码(t.deptno,'4 0',1 ))为“4 0(DEPTNO)”; 来自 scott.emp t t.job;
说实话,这篇文章可读性不是很好。
如果还有更多的部门,这个 SQL 会是什么样子?另外,每次更改部门编号都必须更改SQL,这很令人头疼。
当时一桌有几百位顾客。
我直接写了几百行SQL,修改起来就像筑长城一样。

有趣的是,Oracle 1 1 g之后引入的PIVOT功能是双向的。
这种写法确实很优雅,但前提是你的数据库支持: sql as tmp_tab(从 scott.emp t 中选择 t.job、t.deptno); 选择 tmp_tab。
ivot (count(1 ))) for (1 0,2 0,3 0,4 0);
但我已经步入深渊了。
给甲方做了报告后,他们的旧环境是1 0g,他们的临时环境是1 2 c。
结果我用PIVOT写测试SQL,在甲方环境下报错直接举报。
当时真的把我吓坏了,我很快就改用了代码存储方法。
因此,必须在项目初期验证数据库版本,以免使用后立即崩溃。

坦率地说,这两种方法各有利弊。
尽管解码堆栈很丑陋。
兼容性完全稳定,甚至可以运行8 i数据库。
PIVOT 写起来确实很有趣,但是如果你使用它太多,你可以很容易地创建依赖关系模式。
如果你遇到旧版本的数据库,你会感到惊讶。

最近接手一个老项目,发现整个报表系统都是用代码写的。
我当时真的很震惊。
幸运的是,这是一个测试环境,所以我很快将所有内容转移到 PIVOT。
其中一个视图仍然使用 9 i 语法;我还得再回去。
你说这堂课的专栏问题真的很考验技巧和耐心。

当数据量较小时,两种方法差别不大。
不过,当Dataw的量达到百万级时,PIVOT的实施方案可能就不太方便了。
我记得有一个项目实验; PIVOT 的响应时间上升到几分钟,最终它在出现之前就分裂成了几个代码嵌套。
我自己从来没有遇到过这种情况。
我注意到数据延迟了X秒,但我建议你验证一下。

所以现在我的习惯是先看数据库版本。
如果是 1 2 c 或更高,请先使用 PIVOT。
如果是旧版本,请使用诚实的代码。
不管怎样,报错总比以后被客户骂要好。

Hive SQL 实现行列互转

说实话,在Hive中使用爆炸将行转换为列是非常令人困惑的。
以前在创建电商用户行为表时遇到过一种情况:用户表中有一个产品,存储了每天每个功能的使用次数。
例如,如果用户在某一天使用了三个活动(搜索、浏览和购买),则数组键是活动名称,值是次数。
直接观察这个结构是很困难的,尤其是当你想分析用户使用哪些功能较多以及使用程度如何时。

当时我想将行转换为列。
我刚刚使用了 hiveblast 功能。
例如,这样写。
广场 选择 user_id、日期、属性、计数 从 ( 选择 user_id、日期、burst(属性) 作为(属性、计数); 来自用户产品使用情况 ) t
这可以将数组分成多行,每行都有一个函数名称和关联的次数。
但是,我遇到了一个陷阱,即选择多个分解字段后无法直接选择它们。
比如要选择attribute和user_id,直接写会报错。
后来我意识到我应该使用LateralView,如下所示: 广场 选择 user_id、日期、属性、计数 从 ( 选择 user_id ,日期,属性,侧视图爆炸(属性)attributes_map as(属性,计数)as t 来自用户产品使用情况 )这样您就可以同时访问删除的属性和原始的 user_id 。
有趣的是,一旦 LateralView 与 Explode 结合起来,Hive 似乎能够同时了解哪些字段是需要的,并且直接将其用作 Explode 并不会搞乱一切。

关于列转换,我最近在处理用户反馈表时用到了它。
该表记录了每个用户的意见。
要执行情感分析,来自同一用户的评论应合并为一行。
Hive的group_concat非常好用,例如: 广场 选择 user_id, group_concat(content, ',') 作为评论; 来自用户评论 GROUP BY user_id
这可以将同一用户的所有评论分组到一行中,以逗号分隔。
我还尝试使用其他约束(例如换行符)来查看结果是否会更好。
在信息中我记得在模型中使用逗号后结果就可以了,但是必须运行一些数字才能看到。
我个人没有做过这方面的中文情感分析,但是在英文的情况下,逗号和换行符的区别可能不是特别大。
这两种操作很常见。
一是将字段拆分为多行以查看详细信息,二是将多行合并为一行以查看整个字段。
处理 Hive 并不是特别复杂,但是在使用 LateralView 时必须注意字段别名,这可能会造成混乱。