Sql 在其他列中有相同数据的列中转换一行

Sql 在其他列中有相同数据的列中转换一行,sql,oracle,Sql,Oracle,我已经访问了这个网站很久,并得到了很多帮助。现在我找不到我要找的东西。 我正在研究Oracle SQL数据库 桌子 我想做的是扩展A列和B列中数据相同的列,比如: columnA ColumnB ColumnC ext.ColumnD ext.ColumnE ext.ColumnF 10A AA 00 10 20 30 10A BB 00 10 20 30

我已经访问了这个网站很久,并得到了很多帮助。现在我找不到我要找的东西。 我正在研究Oracle SQL数据库

桌子

我想做的是扩展A列和B列中数据相同的列,比如:

columnA ColumnB ColumnC ext.ColumnD ext.ColumnE ext.ColumnF
 10A       AA      00      10           20         30
 10A       BB      00      10           20         30
我尝试了不同的支点,尝试了很多我在论坛上找到的建议,但都没有得到我希望的结果

这是我的第一篇帖子,如果有什么错误或信息丢失,请提前道歉

提前非常感谢

/编辑

而且C列中不会总是有相同的数据,甚至不会有那么多不同的数据。如果BB没有10个,并且有差异,那么它应该是这样的:

columnA ColumnB ColumnC ext.ColumnD ext.ColumnE ext.ColumnF
 10A       AA      00      10           20         30
 10A       BB      00      17           47        
columnA ColumnB ColumnC ColumnD
 10A       AA      00    699787
 10A       AA      10    439567
 10A       AA      20    429456
 10A       AA      30    122172
 10A       BB      00    133244
 10A       BB      10    328311
 10A       BB      20    247422
 10A       BB      30    769636
同样的目标是让它们增加顺序,但这可以通过查询、排序来完成


/编辑

现在我有了这张桌子:

ColumnA ColumnB ColumnC Height1 Height2 Height3 height4
5A        11       A       0       25       50     75
5A        11       B       0       25       50     75
5A        11       C       0       25       50  
5A        11       D       0       25       50     75
我在原始表格中有一行有唯一的随机数字,它需要跟在高度后面。具有唯一行的透视表:

ColumnA     ColumnB     ColumnC     Unique      ColumnE     ColumnF     ColumnG ColumnG
5A            11           A        16805097      00                            
5A            11           A        62366527                    25                      
5A            11           A        65672596                            75              
5A            11           A        68078617                                       50               
因此,结果将是:

ColumnA ColumnB ColumnC Height1 Unique1 Height2 Unique2 Height3 Unique3 Height4 Unique4
5A       11      A       00     16805097  25    62366527  75    65672596  50   68078617                                                                 

因此,如果我们采用原始问题表,起点如下:

columnA ColumnB ColumnC ext.ColumnD ext.ColumnE ext.ColumnF
 10A       AA      00      10           20         30
 10A       BB      00      17           47        
columnA ColumnB ColumnC ColumnD
 10A       AA      00    699787
 10A       AA      10    439567
 10A       AA      20    429456
 10A       AA      30    122172
 10A       BB      00    133244
 10A       BB      10    328311
 10A       BB      20    247422
 10A       BB      30    769636

Jan

如果使用
listag
列C
中的值组合到一个CSV列表中,则可以使用
REGEXP\u SUBSTR
获取该CSV列表中的值。下面的示例为
ColumnA
ColumnB
的每个组合返回最多5个值,但如果需要5个以上的列,则可以添加其他
REGEXP\u SUBSTR

查询 结果
您也可以使用
PIVOT
并使用它。我们可以使用
row_number()
通过
分区columnA和columnB
给出一个唯一的数字,然后在pivoting子句中使用它

您可能知道的唯一缺点是对
PIVOT
子句中的值进行硬编码。我已经采取了最多10个值,从现在起,你可以根据需要进行调整

注:
PIVOT
生成的列名格式为,例如
COLUMND
COLUMNE
等。。可以根据需要在最外层查询中进一步更改。您也可以为
MAX(columnC)some_alias
指定一个别名,但随后列名称将附加它,如
COLUMND_some_alias
COLUMNE_some_alias

SELECT *
  FROM
(
SELECT columnA,columnB,columnC,
       row_number() OVER (PARTITION BY columnA,columnB ORDER BY columnC) rn_pivot
  FROM table1
)
PIVOT
(
 MAX(columnC)
 FOR rn_pivot IN (1 AS columnD
                 ,2 AS columnE
                 ,3 AS columnF
                 ,4 AS columnG
                 ,5 AS columnH
                 ,6 AS columnI
                 ,7 AS columnJ
                 ,8 AS columnK
                 ,9 AS columnL
                 ,10 AS columnM)
);

如果“BB”在C列中没有带“10”的行,结果会是什么样的呢?谢谢,我已经对原始问题进行了更详细的编辑-Jan使用pivot应该是可能的,但前提是您对pivoting子句的硬编码值没有异议?您的oracle版本是什么?这一点很重要,因为只有在Oracle 18早期的Oracle版本中,才有可用的PTF(多态表函数)。您无法编写返回动态列数的纯sql查询(Oracle CBO查询解析限制),因此您需要类似于基于Tom Kyte的PIVOT包的my XT_PIVOT包的东西:哦,天哪!这是有效的。非常感谢Sujitmohanty30!谢谢@Jan00,很好。如果答案解决了你的问题,你介意接受吗?谢谢。:)我刚刚补充了更多信息。这很好,但是忘记了我需要在结果中再显示一行。你介意看一下我对原始问题的编辑吗?非常感谢。在此之后,这将是一个完整的包并完成:)-Jan@Jan00,通常情况下,正如我所看到的,我们需要发布另一个问题,但我认为您的更改与原始帖子相比并不大。因此,您只需添加
max(columnD)
。和max(columnC)一样,max(columnD)也应该工作。我不是在我的电脑前验证它,但它应该可以工作。请检查并给出反馈,否则我会在我使用笔记本电脑时进行检查。但您需要检查别名的生成方式以及是否需要更改。
SELECT *
  FROM
(
SELECT columnA,columnB,columnC,
       row_number() OVER (PARTITION BY columnA,columnB ORDER BY columnC) rn_pivot
  FROM table1
)
PIVOT
(
 MAX(columnC)
 FOR rn_pivot IN (1 AS columnD
                 ,2 AS columnE
                 ,3 AS columnF
                 ,4 AS columnG
                 ,5 AS columnH
                 ,6 AS columnI
                 ,7 AS columnJ
                 ,8 AS columnK
                 ,9 AS columnL
                 ,10 AS columnM)
);