Oracle将行转换为列

时间:2018-04-10 16:05:19

标签: sql oracle pivot

我有一张表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

任何帮助将不胜感激。谢谢。

2 个答案:

答案 0 :(得分:0)

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

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,了解它是如何工作的......我对数据库的看法很糟糕,但我认为这样做会有所作为。

GL!

答案 1 :(得分:0)

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

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,那就不明显了。