暂无图片
多文本行转列(pivot)的实现
我来答
分享
ORACLE11g
2021-12-29
多文本行转列(pivot)的实现

有这样一张表

ID Question Answer
1 Q1 Has your problem been Resolved? Q1A
2 Q2 Has your problem been Resolved? Q2A
3 Q3 Has your problem been Resolved? Q3A
4 Q4 Has your problem been Resolved? Q4A
5 Q5 Has your problem been Resolved? Q5A
6 Q6 Has your problem been Resolved? Q6A
7 Q7 Has your problem been Resolved? Q7A
8 Q8 Has your problem been Resolved? Q8A
9 Q9 Has your problem been Resolved? Q9A
10 Q10 Has your problem been Resolved? Q10A
11 Q11 Has your problem been Resolved? Q11A
12 Q12 Has your problem been Resolved? Q12A

需要转化为

Q1_Question Q1_ANSWER Q2_Question Q2_ANSWER Q12_Question Q12_ANSWER
Q1 Has your problem been Resolved? Q1A Q2 Has your problem been Resolved? Q2A Q12 Has your problem been Resolved? Q12A

用PIVOT函数 怎么实现呢?这种双文本呃转换。

我来答
添加附件
收藏
分享
问题补充
5条回答
默认
最新
chengang

两个列分别pivot 后 再 cross join 就可以了

暂无图片 评论
暂无图片 有用 0
ORACLE11g
题主
2021-12-29
可以写一下嘛?CROSS JOIN 没用过
chengang

因为两个列转行了后,就都只有一行了。 就是笛卡尔积就是

暂无图片 评论
暂无图片 有用 0
DarkAthena

pivot里是可以有多个聚合列的,列名会自动拼接

create table pivot_test (id number ,q varchar2(100),a varchar2(100)); insert into pivot_test (ID, Q, A) values (1, 'Q1', 'A1'); insert into pivot_test (ID, Q, A) values (2, 'Q2', 'A2'); insert into pivot_test (ID, Q, A) values (3, 'Q3', 'A3'); commit; select * from pivot_test PIVOT(MAX(Q) Q, MAX(A) A FOR ID IN(1, 2, 3))

image.png

暂无图片 评论
暂无图片 有用 2
ORACLE11g
题主
2021-12-29
有点接近了,大佬。但是实际场景中,ID会有几百万个,并且没有规律。如果用ID IN 不太现实
DarkAthena
答主
2021-12-29
你有1百万个id就有2百万个列,请问现在有什么图形工具能展示两百万个列出来?
赵勇
2021-12-30
for xx in () 中的XX应该是要转换为列名的值在原表中的列名。所以,我感觉你最初给的例子有些奇怪。正常的应该是类似如下:假设原表有三列,分别是姓名、学科和成绩,内容是 行1:张三 语文 80 行2 张三 数学 73 行3:李四 数学 88 行4 李四 化数 82. 转换后,应该是张三单独一行,李四单独一行,行内除去姓名外,还有其它各科的成绩。而列名就是对应的各学科的名字。在这个例子中,xx就是“学科”,而IN中的值,就是哪些学科要出现在最转换后的表的列上。
ORACLE11g

ID类似于这种 【3ca63e88-d93d-4a3d-8c84-0001c2cc6141】

暂无图片 评论
暂无图片 有用 0
刘晓华

有几百万个ID,写在IN里确实不现实,但是我想问的是,为啥有这么个需求呢?是需求不合理还是结构设计不合理

暂无图片 评论
暂无图片 有用 0
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏