Oracle SQL在版本9i中组合了表和数据透视表

时间:2016-03-03 02:00:16

标签: sql oracle

我正在尝试找到一种方法来组合2个表和数据透视表。需要注意的是,我正在使用oracle版本9i,它显然没有枢轴功能。所以我希望有一种可以解决这个问题的黑客方式。我有2个表格,格式如下:

人员表:

ID  NAME
 1  John
 2  Steve
 3  Bob
 4  Gary

电话号码表:

ID TYPE NUMBER
 1   1  555-5555
 2   1  555-5556
 2   2  555-5557
 3   2  555-5558
 4   5  555-5559

我希望能够按如下方式加入表格:

ID NAME  NUMBER_1  NUMBER_2
 1 John  555-5555  
 2 Steve 555-5556  555-5557
 3 Bob             555-5558
 4 Gary

请注意,有许多不同的TYPE值,但我只关心1和2.

我现在的解决方案是加入ID上的表格,并使用TYPE上的CASE语句条件来生成NUMBER_1NUMBER_2。问题是如果我加入表格,那么史蒂夫会有2行。

1 个答案:

答案 0 :(得分:1)

您可以使用conditional aggregation来模仿pivot,因为您只关心类型1和2:

select p.id, 
     p.name, 
     max(case when pn.type = 1 then pn.number end) number_1,
     max(case when pn.type = 2 then pn.number end) number_2
from person p
    left join phonenumber pn on p.id = pn.id
        and pn.type in (1,2)
group by p.id, p.name

如果需要null结果,请改用outer join。 (阅读你的评论,他们是,所以我更新了答案)。如果您不想让没有电话号码的人返回,请将其更改回inner join

注意:使用group by可确保您每人只能获得一行。 conditional aggregation将允许您返回家庭和手机号码。

根据您对评论的关注,这可以作为子查询包含在内:

select *
from sometable s
   join (
        select p.id, 
             p.name, 
             max(case when pn.type = 1 then pn.number end) number_1,
             max(case when pn.type = 2 then pn.number end) number_2
        from person p
            left join phonenumber pn on p.id = pn.id
                and pn.type in (1,2)
        group by p.id, p.name
    ) t on t.id = s.id