Oracle将行透视为列

weylhg0b  于 2023-04-29  发布在  Oracle
关注(0)|答案(2)|浏览(190)

我有一个表A,其中有以下记录。

Use_code | SITE_NUM | rep_name
 BILL_TO       119     abc
 SHIP_TO       119     xyz
 BILL_TO       120     jkf
 SHIP_TO       121     nir

我需要像下面这样更新表B。对于每个SITE_NUM,我们需要更新不同列下的BILL_TO和SHIP_TO记录rep_name,如下所示。

SITE_NUM | BILL_TO_REP_NAME | SHIP_TO_REP_NAME
 119      | abc              | xyz
 120      | jkf              | null
 121      | nul              | nir

任何帮助都将不胜感激。谢谢大家。

cig3rfwq

cig3rfwq1#

您可以使用条件聚合来生成结果:

select a.site_num,
       max(case when a.use_code = 'BILL_TO' then rep_name end) as bill_to,
       max(case when a.use_code = 'BILL_FROM' then rep_name end) as bill_from
from a
group by a.site_num;

要使用此信息更新行,可以使用merge。不过,如果您真的需要update,这并不明显。

zhte4eai

zhte4eai2#

我不确定这是不是最好的解决方案,但这是我想到的第一件事,如果没有更好的解决方案,你可以尝试这样做:

SELECT s.SITE_NUM, b.REP_NAME AS BILL_TO_REP_NAME, 
       sh.REP_NAME AS SHIP_TO_REP_NAME
FROM (SELECT SITE_NUM
     FROM tblA
     GROUP BY SITE_NUM) s
LEFT OUTER JOIN (SELECT SITE_NUM, rep_name
                FROM tblA
                WHERE Use_code = 'BILL_TO') b ON s.SITE_NUM = b.SITE_NUM
LEFT OUTER JOIN (SELECT SITE_NUM, rep_name
                FROM tblA
                WHERE Use_code = 'SHIP_TO') sh ON s.SITE_NUM = sh.SITE_NUM
ORDER BY s.SITE_NUM;

下面是SQL Fiddle,看看它是如何工作的。..我对数据库有点生疏了,但我想这个可以胜任。

相关问题