在Oracle中将多行合并为一行
我有如下oracle表数据:在Oracle中将多行合并为一行,oracle,Oracle,我有如下oracle表数据: ID ColA ColB ColC ColD ColE ColF 1 null null null D1 E1 F1 1 A1 B1 C1 null null null 1 A2 B2 C2 null null null 我想要像这样的唱片 ID ColA ColB ColC ColD ColE
ID ColA ColB ColC ColD ColE ColF
1 null null null D1 E1 F1
1 A1 B1 C1 null null null
1 A2 B2 C2 null null null
我想要像这样的唱片
ID ColA ColB ColC ColD ColE ColF
1 A1 B1 C1 D1 E1 F1
1 A2 B2 C2 D1 E1 F1
基本上,
单个ID可以有多个ColA行,对于这些行,ColD、E和F将始终为空。
那么ID@ColA组合(其中ColA不为null)我想用ColD、E和F对应的值填充D、E和F,ColA为null的ID相同,这里我可以看到一种可能的方法是在以下三种条件下自联接表:
值匹配ID
- 联接左侧的
、ColA
和ColB
值不是ColC
,并且NULL
- 联接右侧的
、ColD
和ColE
值不是ColF
NULL
SELECT
t1.ID,
t1.ColA,
t1.ColB,
t1.ColC,
t2.ColD,
t2.ColE,
t2.ColF
FROM yourTable t1
LEFT JOIN yourTable t2
ON t1.ID = t2.ID
WHERE
t1.ColA IS NOT NULL AND
t1.ColB IS NOT NULL AND
t1.ColC IS NOT NULL AND
t2.ColD IS NOT NULL AND
t2.ColE IS NOT NULL AND
t2.ColF IS NOT NULL;
您需要使用
MAX
分析函数来填充空白COLD
,COLE
和COLF
列中的所有详细信息,然后需要where子句
从示例数据中筛选出第一行,其中COLA
,COLB
和COLC
都是空的
请尝试以下查询:
SELECT
*
FROM
(
SELECT
ID,
COLA,
COLB,
COLC,
MAX(COLD) OVER(
PARTITION BY ID
) AS COLD,
MAX(COLE) OVER(
PARTITION BY ID
) AS COLE,
MAX(COLF) OVER(
PARTITION BY ID
) AS COLF
FROM
YOUR_TABLE
)
WHERE
COLA IS NOT NULL
AND COLB IS NOT NULL
AND COLC IS NOT NULL;
干杯 谢谢你,蒂姆。除了连接同一个表之外的任何其他方式,因为我发布的数据集是由涉及UNION的多个子查询组成的。所以我也不想把表演搞砸。你现在问的是一个完全不同的问题,而不是你实际发布的内容。不,除了我使用的自连接方法之外,我看不到任何其他方法来处理您的需求。