gpt4 book ai didi

sql - Oracle 11 SQL : Split 1 row into x rows and insert a new column

转载 作者:行者123 更新时间:2023-12-04 22:39:08 24 4
gpt4 key购买 nike

我问 Oracle 11 SQL : Is there a way to split 1 row into x rows - 这个问题非常接近,但有一个小转折......

客户要求将 Oracle DB SQL 中的 1 行拆分为 6 行。

比方说,最初的 SQL(具有多个连接的复杂 sql 等)正在拉入 9 列:

select A, B, C, D, E, F, G, H, I  
from X, Y, Z . . .

(但相当复杂的查询)
1) A, B, C, D, E, F, G, H, I.

现在,客户要求每一行返回模式,新的输出应该如下所示:
1) A, B, C, 'Name for D : ', D  
2) A, B, C, 'Name for E : ', E
3) A, B, C, 'Name for F : ', F
4) A, B, C, 'Name for G : ', G
5) A, B, C, 'Name for H : ', H
6) A, B, C, 'Name for I : ', I

基本上,第 1 个 3 列值将在所有 6 个新行中重复。
新行中的第 4 列将是一个字符串,表示第 5 列的内容。

该过程对原始查询中的每一行重复。

从之前的答案中,我知道 unpivot 可以做到这一点——只是无法自己解决这个问题。

更新:

实际上,我在我的问题中并不清楚我想要的第 4 列的输出不是直接连接。如果是这样的话,我本可以自己做的。这些值不是 D、E、F、G、H、I 的文字串联。
D、E、F、G、H、I 的第 4 列值如下? :
列侬,
保罗麦卡特尼,
林戈·斯塔尔
乔治·哈里森
皮特·贝斯特,
汤米摩尔

所以,输出现在看起来像:
1) A, B, C, 'Lennon : ', D  
2) A, B, C, 'paul McCartney : ', E
3) A, B, C, 'Ringo Starr : ', F
4) A, B, C, 'George Harrison : ', G
5) A, B, C, 'Pete Best : ', H
6) A, B, C, 'Tommy Moore : ', I

我希望您明白第 4 列的值可以是任何字符串,而不是第 5 列的派生词。

更新 2:
假设,为了说明目的,我的复杂查询可以简化为 the classic Oracle Tables

假设,我在这些 Emp 和 Dept 表上运行此 SQL:
select emp.empno, emp.ename, emp.job, emp.mgr, emp.hiredate, emp.sal , dept.deptno, dept.dname, dept.loc from emp, dept where emp.deptno = dept.deptno;  

就我而言,第 4 列将是“mgr”、“hiredate”、“sal”、“deptno”、“dname”和“loc”。

因此,例如,对于来自上述查询的以下(原始)结果行:
empno、ename、job、mgr、hiredate、sal、deptno、dname、loc
7698, BLAKE, 经理, 7839, 1981-05-01, 2850.00, 30, 销售, 芝加哥

新品 6 行将是
7698 布莱克经理经理 7839
7698 BLAKE MANAGER 聘用 1981-05-01
7698 布莱克经理萨尔 2850.00
7698 布莱克经理部门 30
7698 BLAKE MANAGER dname 销售
7698 BLAKE MANAGER loc CHICAGO

我该怎么做才能把上面的SQL转换成上面的 新品 6 行?

最佳答案

您可以使用 unpivot 子句。我认为这段代码会帮助你:

select a,b,c,'Name for ' || name_code || ' : '|| name_code as value  from 
(select 'A' a ,'B' b ,'C' c ,'D' d,'E' e,'F' f,'G' g,'H' h,'I' i from dual)
unpivot include nulls
(
name_for for name_code in (d as 'D', e as 'E' ,f as 'F',g as 'G',h as 'H',i as 'I')
);

问题更新后。答案改成这样:
select A,B,C,'Name for ' || name_for  as value, name_code  from 
(select 1 A,2 B,3 C,'Lennon' D,'Paul McCartney' E, 'Ringo Starr' F,
null G, 'Pete Best'H, 'Tommy Moore' I from dual )
unpivot include nulls
(
name_for for name_code in (d,e,f,g,h,i)
)

关于sql - Oracle 11 SQL : Split 1 row into x rows and insert a new column,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59244741/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com